{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-02-05T01:27:33.001532Z",
     "start_time": "2025-02-05T01:27:30.865375Z"
    }
   },
   "source": [
    "# 导入库\n",
    "import matplotlib as mpl\n",
    "# Matplotlib 绘制的图形会直接嵌入到 Notebook 的输出单元格中，而不是弹出一个独立的窗口\n",
    "%matplotlib inline\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "\n",
    "# os库提供了一种使用操作系统相关功能的便捷方式，允许与操作系统进行交互\n",
    "import os\n",
    "\n",
    "# sys库主要用于处理Python运行时的环境相关信息以及与解释器的交互\n",
    "import sys\n",
    "import time\n",
    "\n",
    "# tqdm库是一个快速，可扩展的Python进度条，可以在 Python 长循环中添加一个进度提示信息，用户只需要封装任意的迭代器 tqdm(iterator)，即可获得一个进度条显示迭代进度。\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "\n",
    "# torch.nn是PyTorch中用于构建神经网络的模块\n",
    "import torch.nn as nn\n",
    "\n",
    "# torch.nn.functional是PyTorch中包含了神经网络的一些常用函数\n",
    "import torch.nn.functional as F"
   ],
   "outputs": [],
   "execution_count": 1
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T01:28:17.472936Z",
     "start_time": "2025-02-05T01:28:17.467939Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# Python 中的一个属性，用于获取当前 Python 解释器的版本信息。它返回一个命名元组（named tuple）\n",
    "print(sys.version_info)\n",
    "\n",
    "# 遍历模块，打印模块名称和版本信息，快速检查当前环境中安装的某些常用 Python 库的版本信息\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "# 判断是否有 GPU，如果有，则使用 GPU 进行训练，否则使用 CPU 进行训练\n",
    "# torch.cuda.is_available()用于判断是否有GPU\n",
    "# torch.device(\"cuda:0\")创建一个 PyTorch 设备对象，表示使用第一个 GPU（索引为 0）\n",
    "# torch.device(\"cpu\")创建一个 PyTorch 设备对象，表示使用 CPU\n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)"
   ],
   "id": "31109c0781d06ce5",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.0\n",
      "torch 2.5.1+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 数据准备",
   "id": "3abc38ce65cbdd17"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T01:32:26.515653Z",
     "start_time": "2025-02-05T01:32:25.686979Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 提供了许多常用的公开数据集\n",
    "from torchvision import datasets\n",
    "\n",
    "# 导入 ToTensor 类，它是一个图像变换工具，用于将 PIL 图像或 NumPy 数组转换为 PyTorch 张量（torch.Tensor）\n",
    "# 同时将像素值从 [0, 255] 缩放到 [0.0, 1.0]\n",
    "# 在加载数据集时，通常需要将图像转换为张量，以便输入到神经网络中\n",
    "from torchvision.transforms import ToTensor\n",
    "\n",
    "# 图像预处理工具，用于对图像进行各种变换（如缩放、裁剪、旋转、归一化等）\n",
    "from torchvision import transforms\n",
    "\n",
    "# 训练集\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",  # 数据集存储路径\n",
    "    train=True,  # 加载训练集\n",
    "    download=True,  # 如果数据集不存在，则自动下载\n",
    "    transform=ToTensor()  # 转化为张量\n",
    ")\n",
    "\n",
    "# 测试集\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",  # 数据集存储路径\n",
    "    train=True,  # 加载测试集\n",
    "    download=True,  # 如果数据集不存在，则自动下载\n",
    "    transform=ToTensor()  # 转化为张量\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "id": "9a7b27f1498eb62e",
   "outputs": [],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T01:33:04.932399Z",
     "start_time": "2025-02-05T01:33:04.928305Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 数据加载与预处理\n",
    "# 使用了PyTorch的`DataLoader`类来加载数据，它可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。\n",
    "\n",
    "# 作用：创建一个数据加载器，用于加载训练集。\n",
    "# 参数：\n",
    "# train_ds：训练集数据集对象,\n",
    "# batch_size：每次加载的样本数量,控制每次加载的样本数量，影响内存占用和训练速度。\n",
    "# 太小导致梯度震荡，太大占用内存。\n",
    "# shuffle=True：在每个 epoch 开始时打乱数据顺序，确保模型不会记住样本的顺序。\n",
    "# 原理：\n",
    "# DataLoader 将数据集分成多个批次（batch），每个批次包含 batch_size 个样本。\n",
    "# 在训练过程中，模型会逐批次地读取数据并进行训练。\n",
    "# shuffle=True 确保每个 epoch 中数据的顺序不同，避免模型过拟合。\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True)\n",
    "\n",
    "# 作用：创建一个数据加载器，用于加载验证集或测试集。\n",
    "# 参数：\n",
    "# shuffle=False：不打乱数据顺序，确保验证或测试结果可重复。\n",
    "# 原理：\n",
    "# 在验证或测试过程中，模型会逐批次地读取数据并进行评估。\n",
    "# shuffle=False 确保数据顺序固定，便于结果的可重复性和分析。\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ],
   "id": "15b683fc59d21aff",
   "outputs": [],
   "execution_count": 4
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 定义模型",
   "id": "d7786f5b326c360b"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T01:33:50.263863Z",
     "start_time": "2025-02-05T01:33:50.258516Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 定义一个名为NeuralNetwork的类，继承自nn.Module\n",
    "class NeuralNetwork(nn.Module):\n",
    "\n",
    "    # 定义网络的结构\n",
    "    def __init__(self):\n",
    "        # 调用父类nn.Module的初始化方法，完成模型的初始化\n",
    "        super().__init__()\n",
    "\n",
    "        # 定义一个Flatten层，用于将输入的多维张量展平为一维张量\n",
    "        # 例如，如果输入是(batch_size, 28, 28)的张量，展平后会变成(batch_size, 784)\n",
    "        self.flatten = nn.Flatten()\n",
    "\n",
    "        # 定义一个Sequential容器，包含多个线性层和激活函数\n",
    "        # Sequential容器会按照顺序依次执行其中的层\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "\n",
    "            # nn.Linear 是一个全连接层（线性层），其公式为 y = xA^T + b，A 是权重矩阵，b 是偏置向量\n",
    "            # nn.Linear(in_features, out_features) 中的 in_features 是输入特征的维度，out_features 是输出特征的维度\n",
    "            # 第一个全连接层，输入维度为784，输出维度为300\n",
    "            nn.Linear(784, 300),\n",
    "            # ReLU激活函数，引入非线性，公式为ReLU(x) = max(0, x)\n",
    "            nn.ReLU(),\n",
    "            # 第二个全连接层，输入维度为300，输出维度为100\n",
    "            nn.Linear(300, 100),\n",
    "            # 再次使用ReLU激活函数\n",
    "            nn.ReLU(),\n",
    "            # 第三个全连接层，输入维度为100，输出维度为10\n",
    "            # 这里的输出维度为10，通常对应于10个类别的分类任务\n",
    "            nn.Linear(100, 10),\n",
    "        )\n",
    "\n",
    "    # 定义前向传播函数，定义数据的前向传播过程\n",
    "    def forward(self, x):\n",
    "        x = self.flatten(x)  # 首先将输入张量展平\n",
    "        logits = self.linear_relu_stack(x)  # 然后将展平后的张量通过线性层和激活函数\n",
    "        return logits  # 返回最终的输出logits（未经过softmax处理的原始分数）\n",
    "\n",
    "\n",
    "# 实例化NeuralNetwork类，创建一个神经网络模型对象\n",
    "model = NeuralNetwork()"
   ],
   "id": "42119bff80074f99",
   "outputs": [],
   "execution_count": 5
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 训练",
   "id": "b779f970d4643af5"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T01:36:04.355209Z",
     "start_time": "2025-02-05T01:36:04.323733Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "\n",
    "# 这是一个装饰器，用于禁用梯度计算。\n",
    "# 在评估模型时，我们不需要计算梯度，因为不会进行反向传播和参数更新。禁用梯度计算可以减少内存消耗并加速计算。\n",
    "@torch.no_grad()\n",
    "# 定义评估函数，接受三个参数：model（要评估的模型）、dataloader（数据加载器，用于提供评估数据）、loss_fct（损失函数）。\n",
    "# 用于评估模型在给定数据集上的性能。\n",
    "# 通过封装评估过程，可以方便地在不同模型和数据集上重复使用。\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    # 初始化三个空列表，分别用于存储每个批次的损失、预测标签和真实标签。\n",
    "    # 用于累积所有批次的损失和标签，以便后续计算平均损失和准确率。\n",
    "    # 累积所有批次的结果可以更准确地反映模型在整个数据集上的性能。\n",
    "    loss_list = []  # 记录损失\n",
    "    pred_list = []  # 记录预测\n",
    "    label_list = []  # 记录标签\n",
    "\n",
    "    # 遍历数据加载器中的每个批次，datas 是输入数据，labels 是对应的真实标签\n",
    "    for datas, labels in dataloader:\n",
    "        # 将输入数据和标签移动到指定的设备（GPU或CPU），转到GPU可以加速计算\n",
    "        datas = datas.to(device)\n",
    "        labels = labels.to(device)\n",
    "\n",
    "        # 将输入数据传递给模型，得到模型的输出 logits（通常是未归一化的预测分数）。\n",
    "        # 模型的前向传播过程，计算输入数据对应的输出。通过模型的输出可以计算损失和预测标签。\n",
    "        logits = model(datas)\n",
    "\n",
    "        # 将当前批次的损失值（转换为 Python 浮点数）添加到 loss_list 中。\n",
    "        # loss.item() 将张量中的单个值提取为 Python 浮点数。\n",
    "        # 累积所有批次的损失值，以便后续计算平均损失。\n",
    "        loss = loss_fct(logits, labels)\n",
    "        loss_list.append(loss.item())\n",
    "\n",
    "        # 通过 argmax 函数获取模型预测的类别标签。axis=-1 表示在最后一个维度上取最大值对应的索引。\n",
    "        # logits 通常是每个类别的分数，argmax 找到分数最高的类别作为预测结果。\n",
    "        # 将模型的输出转换为具体的类别标签，便于与真实标签进行比较。\n",
    "        preds = logits.argmax(axis=-1)\n",
    "\n",
    "        # 将预测标签从 GPU 移动到 CPU，并转换为 NumPy 数组，再转换为 Python 列表，然后添加到 pred_list 中。\n",
    "        # preds.cpu().numpy().tolist() 将张量转换为 Python 列表。\n",
    "        # 累积所有批次的预测标签，以便后续计算准确率。\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "\n",
    "    #计算预测标签和真实标签之间的准确率\n",
    "    acc = accuracy_score(label_list, pred_list)\n",
    "\n",
    "    #返回所有批次的平均损失和准确率。\n",
    "    return np.mean(loss_list), acc"
   ],
   "id": "7ce72b1807932de0",
   "outputs": [],
   "execution_count": 6
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# Tensorboard可视化（用不了）",
   "id": "6d33be14809ce003"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T02:20:42.699263Z",
     "start_time": "2025-02-05T02:20:39.988640Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): dir to write log.\n",
    "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir,\n",
    "                                    flush_secs=flush_secs)  # 实例化SummaryWriter, log_dir是log存放路径，flush_secs是每隔多少秒写入磁盘\n",
    "\n",
    "    def draw_model(self, model, input_shape):  #graphs\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))  # 画模型图\n",
    "\n",
    "    def add_loss_scalars(self, step, loss, val_loss):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\",\n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "        )  # 画loss曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
    "\n",
    "    def add_acc_scalars(self, step, acc, val_acc):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        )  # 画acc曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
    "\n",
    "    def add_lr_scalars(self, step, learning_rate):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "        )  # 画lr曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
    "\n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss,把loss，val_loss取掉，画loss曲线\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss)  # 画loss曲线\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc)  # 画acc曲线\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate)  # 画lr曲线\n"
   ],
   "id": "bdb2fc9d5dabeddf",
   "outputs": [],
   "execution_count": 7
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 保存最佳模型",
   "id": "192b59ce2ef11aaf"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T03:49:59.122698Z",
     "start_time": "2025-02-05T03:49:59.118188Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 定义一个名为 SaveCheckpointsCallback 的类。\n",
    "# 该类用于在训练过程中保存模型的检查点。封装保存检查点的逻辑，方便在训练过程中调用\n",
    "class SaveCheckpointsCallback:\n",
    "    \"\"\"\n",
    "    Callback to save model checkpoints during training.\n",
    "    \"\"\"\n",
    "\n",
    "    #定义类的构造函数，接受以下参数：\n",
    "    # save_dir: 检查点保存的目录。\n",
    "    # save_step: 每隔多少步保存一次检查点，默认值为 500。\n",
    "    # save_best_only: 是否只保存性能最好的检查点，默认值为 True\n",
    "    # 原理：初始化回调类的参数和状态\n",
    "    def __init__(self, save_dir, save_step=500, save_best_only=True):\n",
    "\n",
    "        # 将传入的参数保存为类的属性\n",
    "        self.save_dir = save_dir\n",
    "        self.save_step = save_step\n",
    "        self.save_best_only = save_best_only\n",
    "\n",
    "        # 初始化一个变量 best_metrics，用于记录当前最好的性能指标值，初始值为 -1\n",
    "        # 原理: 用于比较当前模型的性能是否优于之前保存的模型,当 save_best_only 为 True 时，只保存性能最好的模型\n",
    "        self.best_metrics = -1\n",
    "\n",
    "        # 检查保存目录是否存在，如果不存在则创建该目录\n",
    "        # os.path.exists()用于判断路径是否存在, os.mkdir()用于创建目录\n",
    "        if not os.path.exists(self.save_dir):\n",
    "            os.mkdir(self.save_dir)\n",
    "\n",
    "    # 定义 __call__ 方法，使类的实例可以像函数一样调用。参数包括：\n",
    "    # step: 当前训练的步数。\n",
    "    # state_dict: 模型的状态字典（包含模型参数）。\n",
    "    # metric: 当前模型的性能指标值（如验证集准确率），默认为 None\n",
    "    # 在训练过程中定期调用该方法，保存检查点\n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "\n",
    "        # 检查当前步数是否是 save_step 的倍数，如果不是则直接返回\n",
    "        # 控制保存检查点的频率，避免频繁保存\n",
    "        if step % self.save_step > 0:\n",
    "            return\n",
    "\n",
    "        # 检查是否只保存性能最好的检查点\n",
    "        # 根据 save_best_only 的值决定保存策略,提供两种保存策略：定期保存和只保存最佳模型\n",
    "        if self.save_best_only:\n",
    "\n",
    "            # 如果 save_best_only 为 True，则要求 metric 不能为 None。\n",
    "            # 原理: 使用 assert 断言确保 metric 有值。如果 metric 为 None，无法判断模型性能是否更好，因此需要提前检查\n",
    "            assert metric is not None\n",
    "\n",
    "            # 检查当前模型的性能指标是否优于之前保存的最佳模型\n",
    "            # 只保存性能更好的模型，避免保存性能下降的模型\n",
    "            if metric >= self.best_metrics:\n",
    "                # 将模型的状态字典保存到指定目录下的 best.ckpt 文件中\n",
    "                # 使用 torch.save 保存模型参数。保存当前性能最好的模型，方便后续加载和使用\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\"))\n",
    "\n",
    "                # 更新 best_metrics 为当前模型的性能指标值\n",
    "                self.best_metrics = metric\n",
    "\n",
    "        # 如果 save_best_only 为 False，则执行以下逻辑\n",
    "        # 定期保存检查点，不关心模型性能是否更好\n",
    "        else:\n",
    "\n",
    "            # 将模型的状态字典保存到指定目录下，文件名为当前步数\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\"))"
   ],
   "id": "6bbbf437e2b2db1a",
   "outputs": [],
   "execution_count": 16
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 早停",
   "id": "b09a13bb04ae8f0b"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T03:50:02.403037Z",
     "start_time": "2025-02-05T03:50:02.398206Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 定义一个名为 EarlyStopCallback 的类.用于监控模型在验证集上的性能，并在性能不再提升时触发早停。\n",
    "# 封装早停的逻辑，方便在训练过程中调用\n",
    "class EarlyStopCallback:\n",
    "\n",
    "    # 定义类的构造函数，接受以下参数\n",
    "    # patience: 容忍的轮次数，默认值为 5。如果在 patience 轮内性能没有提升，则触发早停。\n",
    "    # min_delta: 性能提升的最小阈值，默认值为 0.01。只有当性能提升超过该阈值时，才认为模型有改进。\n",
    "    # 初始化早停回调的参数和状态\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "\n",
    "        # 将传入的参数保存为类的属性\n",
    "        self.patience = patience\n",
    "        self.min_delta = min_delta\n",
    "\n",
    "        self.best_metric = -1  # 用于比较当前模型的性能是否优于之前的最佳性能\n",
    "\n",
    "        # 初始化一个计数器 counter，用于记录性能没有提升的连续轮次数，初始值为 0\n",
    "        # 当性能没有提升时，计数器增加；当性能提升时，计数器重置,用于判断是否达到了早停的条件\n",
    "        self.counter = 0\n",
    "\n",
    "    # 训练过程中定期调用该方法，更新早停状态\n",
    "    def __call__(self, metric):\n",
    "\n",
    "        # 检查当前性能指标是否比之前的最佳性能提升了至少 min_delta\n",
    "        # 避免微小的波动触发早停,当性能有显著提升时，才认为模型有改进\n",
    "        if metric >= self.best_metric + self.min_delta:\n",
    "\n",
    "            self.best_metric = metric  # 记录当前最佳性能\n",
    "            self.counter = 0  # 性能有提升时，重置计数器,重新开始计算性能没有提升的连续轮次数\n",
    "\n",
    "        # 性能没有提升时，增加计数器\n",
    "        else:\n",
    "            self.counter += 1  # 记录性能没有提升的连续轮次数\n",
    "\n",
    "    # 定义一个只读属性 early_stop，用于判断是否触发早停。\n",
    "    # 使用 @property 装饰器将方法转换为属性。方便外部代码通过属性访问早停状态。\n",
    "    @property\n",
    "    def early_stop(self):\n",
    "\n",
    "        # 检查计数器 counter 是否大于或等于 patience\n",
    "        # 提供早停的触发条件\n",
    "        return self.counter >= self.patience"
   ],
   "id": "ea11c065a10d6af3",
   "outputs": [],
   "execution_count": 17
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 训练",
   "id": "b159e58a5f32441d"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T03:50:02.999076Z",
     "start_time": "2025-02-05T03:50:02.992379Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 定义一个名为 training 的函数，用于训练模型。参数包括：\n",
    "# model: 要训练的模型。\n",
    "# train_loader: 训练数据的数据加载器。\n",
    "# val_loader: 验证数据的数据加载器。\n",
    "# epoch: 训练的轮数。\n",
    "# loss_fct: 损失函数。\n",
    "# optimizer: 优化器。\n",
    "# eval_step: 每隔多少步评估一次验证集性能，默认值为 500。\n",
    "# 该函数通过遍历训练数据，更新模型参数，并定期评估验证集性能。封装训练过程，方便重复使用\n",
    "def training(\n",
    "        model,\n",
    "        train_loader,\n",
    "        val_loader,\n",
    "        epoch,\n",
    "        loss_fct,\n",
    "        optimizer,\n",
    "        tensorboard_callback=None,\n",
    "        save_ckpt_callback=None,\n",
    "        early_stop_callback=None,\n",
    "        eval_step=500,\n",
    "):\n",
    "    # 初始化一个字典 record_dict，用于记录训练和验证过程中的损失和准确率。\n",
    "    # 通过记录训练和验证的性能，可以分析模型的训练过程。方便后续绘制训练曲线或分析模型表现。\n",
    "    record_dict = {\n",
    "        \"train\": [],  # \"train\": 存储训练集的损失和准确率。\n",
    "        \"val\": []  # \"val\": 存储验证集的损失和准确率。\n",
    "    }\n",
    "\n",
    "    # 初始化一个全局步数计数器 global_step，用于记录当前训练的步数。\n",
    "    # 步数用于控制何时评估验证集性能。通过步数而不是轮数来控制评估频率，更灵活。\n",
    "    global_step = 0\n",
    "\n",
    "    # 将模型设置为训练模式。在训练模式下，模型会启用一些特定于训练的功能（如 Dropout 和 BatchNorm）。\n",
    "    # 确保模型在训练时行为正确。\n",
    "    model.train()\n",
    "\n",
    "    # 使用 tqdm 创建一个进度条，总长度为 epoch * len(train_loader)，即总训练步数。\n",
    "    # tqdm 是一个进度条库，用于显示训练进度。\n",
    "    # 提供可视化的训练进度，方便监控训练过程。\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "\n",
    "        # 外层循环，遍历每个训练轮次。每个轮次会遍历整个训练数据集一次。\n",
    "        # 多轮训练可以提高模型的性能。\n",
    "        for epoch_id in range(epoch):\n",
    "\n",
    "            # 内层循环，遍历训练数据加载器中的每个批次。\n",
    "            for datas, labels in train_loader:\n",
    "\n",
    "                # 将输入数据和标签移动到指定的设备（GPU或CPU），转到GPU可以加速计算\n",
    "                datas = datas.to(device)\n",
    "                labels = labels.to(device)\n",
    "\n",
    "                # 清除优化器中之前的梯度。\n",
    "                # PyTorch 会累积梯度，因此在每次反向传播前需要清除之前的梯度。避免梯度累积导致错误的参数更新。\n",
    "                optimizer.zero_grad()\n",
    "\n",
    "                logits = model(datas)  # 模型前向计算\n",
    "                loss = loss_fct(logits, labels)  # 计算损失\n",
    "\n",
    "                # 计算损失相对于模型参数的梯度。\n",
    "                # 反向传播算法，通过链式法则计算梯度。梯度用于更新模型参数，以最小化损失。\n",
    "                loss.backward()\n",
    "\n",
    "                # 使用优化器更新模型参数。\n",
    "                optimizer.step()\n",
    "\n",
    "                preds = logits.argmax(axis=-1)  # 通过 argmax 函数获取模型预测的类别标签。\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())  # 计算当前批次的准确率\n",
    "                loss = loss.cpu().item()  # 将损失值从 GPU 移动到 CPU，并转换为 Python 浮点数。方便记录和打印损失值。\n",
    "\n",
    "                # 将当前批次的损失、准确率和步数记录到 record_dict[\"train\"] 中\n",
    "                # 累积训练过程中的性能指标。方便后续分析训练过程\n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })\n",
    "\n",
    "                # 每隔 eval_step 步评估一次验证集性能。\n",
    "                # 使用 global_step 控制评估频率。定期评估验证集性能，避免过拟合。\n",
    "                if global_step % eval_step == 0:\n",
    "                    # 将模型设置为评估模式\n",
    "                    model.eval()\n",
    "\n",
    "                    # 调用 evaluating 函数计算验证集的损失和准确率\n",
    "                    # 在验证集上评估模型性能。验证集性能反映了模型的泛化能力。\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "\n",
    "                    # 将验证集的损失、准确率和步数记录到 record_dict[\"val\"] 中。\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "\n",
    "                    # 将模型设置为训练模式\n",
    "                    model.train()\n",
    "\n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    if tensorboard_callback is not None:\n",
    "                        # 调用 tensorboard 回调函数，记录训练过程中的关键指标\n",
    "                        tensorboard_callback(\n",
    "                            global_step,  # 当前训练的全局步数，用于在 TensorBoard 中标识不同的训练阶段\n",
    "                            loss=loss, val_loss=val_loss,  # 记录训练集和验证集的损失值，用于监控模型在训练和验证集上的表现\n",
    "                            acc=acc, val_acc=val_acc,  # 记录训练集和验证集的准确率，用于监控模型的分类性能\n",
    "                            lr=optimizer.param_groups[0][\"lr\"],  # 取出当前学习率，用于监控学习率的变化，确保学习率调整策略正常工作\n",
    "                        )\n",
    "\n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        # 调用保存模型权重的回调函数，保存当前模型的权重\n",
    "                        save_ckpt_callback(\n",
    "                            global_step,  # 当前训练的全局步数，用于标识保存的模型权重对应的训练阶段\n",
    "                            model.state_dict(),  # 保存模型的当前状态字典（即模型的所有参数），以便后续可以恢复模型\n",
    "                            metric=val_acc  # 使用验证集的准确率作为指标，判断是否保存当前模型（通常只保存性能最好的模型）\n",
    "                        )\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        # 调用早停回调函数，监控验证集准确率是否不再提升\n",
    "                        early_stop_callback(val_acc)  # 传入验证集准确率，用于判断是否满足早停条件\n",
    "                        if early_stop_callback.early_stop:  # 检查是否触发了早停条件\n",
    "                            # 如果触发了早停条件，打印提示信息并结束训练\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict  # 返回训练记录字典，包含训练过程中的关键指标\n",
    "\n",
    "                # 增加全局步数计数器\n",
    "                # 记录当前训练的步数,控制评估频率和记录训练进度\n",
    "                global_step += 1\n",
    "\n",
    "                # 更新进度条\n",
    "                pbar.update(1)\n",
    "\n",
    "                # 在进度条中显示当前训练的轮次。\n",
    "                # 更新进度条的后缀信息。方便监控训练进度。\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})\n",
    "\n",
    "    # 返回记录的训练和验证性能的字典,包含训练和验证过程中的损失和准确率\n",
    "    return record_dict"
   ],
   "id": "ae9429125f5caa41",
   "outputs": [],
   "execution_count": 18
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T03:50:03.676338Z",
     "start_time": "2025-02-05T03:50:03.650956Z"
    }
   },
   "cell_type": "code",
   "source": [
    "epoch = 100\n",
    "\n",
    "# 实例化NeuralNetwork类，创建一个神经网络模型对象\n",
    "model = NeuralNetwork()\n",
    "\n",
    "# 定义了一个损失函数使用的是交叉熵损失函数，这是分类问题中常用的损失函数。\n",
    "# CrossEntropyLoss 结合了 Softmax 激活函数和 Log Loss，内部先做softmax，再计算交叉熵，用于多类别分类问题。\n",
    "# 输入是未经过 Softmax 处理的 logits（原始预测分数），而目标标签应该是类别的索引\n",
    "loss_fct = nn.CrossEntropyLoss()\n",
    "\n",
    "# 优化器：用于更新模型的参数。\n",
    "# 这里使用的是 SGD（随机梯度下降，Stochastic Gradient Descent）优化算法。通过对每个数据点的梯度进行更新，快速地调整模型参数。\n",
    "# model.parameters()：这一部分是传入模型的所有参数，优化器将会基于这些参数计算梯度并进行更新。\n",
    "# lr：学习率，控制参数更新的步长。学习率越小，更新越慢；学习率越大，可能会导致训练不稳定。0.001 是一个比较常见的初始学习率。\n",
    "# momentum：动量是为了加速 SGD，避免在训练过程中振荡。动量值通常在 0 到 1 之间，0.9 是一个常用的选择。动量帮助优化器在上一次梯度的方向上继续前进，从而使得优化过程更为稳定。\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n",
    "\n",
    "# 实例化\n",
    "# 1. tensorboard 可视化\n",
    "tensorboard_callback = TensorBoardCallback(\"runs\")\n",
    "tensorboard_callback.draw_model(model, [1, 28, 28])\n",
    "# 2. 保存最佳模型\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\"checkpoints\", save_best_only=True)\n",
    "# 3. 早停\n",
    "early_stop_callback = EarlyStopCallback(patience=10)"
   ],
   "id": "4f0361cdc8cca87b",
   "outputs": [],
   "execution_count": 19
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T03:50:06.783658Z",
     "start_time": "2025-02-05T03:50:06.778615Z"
    }
   },
   "cell_type": "code",
   "source": "list(model.parameters())[1]  #可学习的模型参数",
   "id": "57c9ba3e6fc87bf0",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Parameter containing:\n",
       "tensor([-0.0301,  0.0176, -0.0055, -0.0056,  0.0152,  0.0096, -0.0156, -0.0295,\n",
       "         0.0054,  0.0068,  0.0273, -0.0277,  0.0201, -0.0265, -0.0262,  0.0320,\n",
       "        -0.0033,  0.0295, -0.0155,  0.0254, -0.0015, -0.0246, -0.0306,  0.0137,\n",
       "        -0.0245, -0.0028, -0.0031, -0.0232, -0.0183,  0.0112, -0.0318, -0.0181,\n",
       "        -0.0115, -0.0226, -0.0107,  0.0100, -0.0011, -0.0176, -0.0076,  0.0218,\n",
       "        -0.0162, -0.0151,  0.0008, -0.0212, -0.0151,  0.0317, -0.0018,  0.0062,\n",
       "         0.0146,  0.0268,  0.0254,  0.0216, -0.0320,  0.0288, -0.0213, -0.0006,\n",
       "        -0.0238, -0.0274, -0.0044, -0.0059,  0.0183, -0.0162, -0.0271,  0.0163,\n",
       "         0.0216, -0.0009, -0.0336,  0.0255,  0.0298, -0.0129,  0.0214, -0.0031,\n",
       "        -0.0229,  0.0237,  0.0232,  0.0100,  0.0331, -0.0295,  0.0039, -0.0284,\n",
       "        -0.0013,  0.0097,  0.0063, -0.0079, -0.0267, -0.0295,  0.0028,  0.0115,\n",
       "        -0.0353, -0.0084, -0.0346,  0.0277, -0.0317,  0.0271,  0.0192,  0.0241,\n",
       "        -0.0252, -0.0134,  0.0343,  0.0092, -0.0160,  0.0304, -0.0063, -0.0160,\n",
       "        -0.0344, -0.0009, -0.0224, -0.0063,  0.0049, -0.0161, -0.0071,  0.0129,\n",
       "         0.0144,  0.0324, -0.0174, -0.0265, -0.0249,  0.0272,  0.0004, -0.0256,\n",
       "        -0.0176,  0.0229, -0.0042, -0.0086,  0.0156, -0.0059,  0.0073,  0.0263,\n",
       "         0.0186, -0.0205,  0.0168, -0.0319,  0.0314, -0.0265, -0.0099, -0.0068,\n",
       "         0.0056,  0.0067,  0.0070, -0.0204,  0.0109, -0.0076,  0.0125, -0.0192,\n",
       "        -0.0340,  0.0003,  0.0166,  0.0009, -0.0238,  0.0109,  0.0161, -0.0154,\n",
       "         0.0272,  0.0243, -0.0101, -0.0243, -0.0333,  0.0065,  0.0128, -0.0080,\n",
       "        -0.0228, -0.0287, -0.0103,  0.0247, -0.0195,  0.0063,  0.0084,  0.0334,\n",
       "        -0.0270, -0.0276, -0.0034,  0.0343,  0.0273, -0.0029, -0.0135, -0.0153,\n",
       "        -0.0305, -0.0154, -0.0186, -0.0163,  0.0304,  0.0339, -0.0262,  0.0117,\n",
       "         0.0078,  0.0309, -0.0253,  0.0016,  0.0011, -0.0111, -0.0337,  0.0065,\n",
       "        -0.0271,  0.0082,  0.0186, -0.0340,  0.0047, -0.0081, -0.0031,  0.0018,\n",
       "        -0.0121,  0.0089, -0.0170, -0.0221,  0.0189, -0.0236,  0.0062, -0.0285,\n",
       "        -0.0353,  0.0029,  0.0338,  0.0270,  0.0049,  0.0309, -0.0195,  0.0320,\n",
       "        -0.0104,  0.0024,  0.0283,  0.0243,  0.0117, -0.0005, -0.0199, -0.0075,\n",
       "        -0.0182, -0.0190, -0.0167, -0.0262,  0.0301,  0.0095,  0.0102, -0.0132,\n",
       "         0.0203,  0.0267, -0.0001, -0.0108,  0.0103,  0.0119, -0.0299, -0.0257,\n",
       "        -0.0132,  0.0288, -0.0339, -0.0089, -0.0104,  0.0073, -0.0099, -0.0266,\n",
       "        -0.0241, -0.0052,  0.0069,  0.0186, -0.0353, -0.0165,  0.0192,  0.0317,\n",
       "         0.0066,  0.0292,  0.0064, -0.0086,  0.0146, -0.0342, -0.0014, -0.0034,\n",
       "        -0.0149,  0.0180,  0.0267, -0.0277,  0.0304, -0.0198, -0.0003, -0.0099,\n",
       "        -0.0347,  0.0270,  0.0098, -0.0177, -0.0242, -0.0244, -0.0292,  0.0058,\n",
       "        -0.0198, -0.0135, -0.0292, -0.0055,  0.0063, -0.0174,  0.0229,  0.0117,\n",
       "        -0.0216,  0.0134, -0.0104, -0.0181, -0.0123,  0.0072,  0.0012,  0.0223,\n",
       "        -0.0113, -0.0124,  0.0277, -0.0244], requires_grad=True)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "没有1、3层参数是因为是激活函数层，没有可学习的参数。",
   "id": "7918c2dd3ff33f37"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T03:50:07.942027Z",
     "start_time": "2025-02-05T03:50:07.938086Z"
    }
   },
   "cell_type": "code",
   "source": "model.state_dict().keys()  #模型参数名字",
   "id": "4d27261ef348410c",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "odict_keys(['linear_relu_stack.0.weight', 'linear_relu_stack.0.bias', 'linear_relu_stack.2.weight', 'linear_relu_stack.2.bias', 'linear_relu_stack.4.weight', 'linear_relu_stack.4.bias'])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T03:57:03.476100Z",
     "start_time": "2025-02-05T03:50:09.198196Z"
    }
   },
   "cell_type": "code",
   "source": [
    "model = model.to(device)  # 放到device上\n",
    "record = training(\n",
    "    model,\n",
    "    train_loader,\n",
    "    val_loader,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=1000\n",
    ")"
   ],
   "id": "cc2357d9c4a893a6",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/187500 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "dbf4ab1dc5544fe9a449b3230db100fd"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 29 / global_step 55000\n"
     ]
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T03:58:46.726796Z",
     "start_time": "2025-02-05T03:58:46.702132Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 模型训练保存的记录\n",
    "record"
   ],
   "id": "d81036ca16820cc2",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'train': [{'loss': 2.3012185096740723, 'acc': 0.09375, 'step': 0},\n",
       "  {'loss': 2.2908902168273926, 'acc': 0.09375, 'step': 1},\n",
       "  {'loss': 2.2984187602996826, 'acc': 0.125, 'step': 2},\n",
       "  {'loss': 2.291337251663208, 'acc': 0.09375, 'step': 3},\n",
       "  {'loss': 2.285351514816284, 'acc': 0.1875, 'step': 4},\n",
       "  {'loss': 2.3013811111450195, 'acc': 0.0625, 'step': 5},\n",
       "  {'loss': 2.288120746612549, 'acc': 0.09375, 'step': 6},\n",
       "  {'loss': 2.285869598388672, 'acc': 0.0625, 'step': 7},\n",
       "  {'loss': 2.287229299545288, 'acc': 0.125, 'step': 8},\n",
       "  {'loss': 2.2932987213134766, 'acc': 0.125, 'step': 9},\n",
       "  {'loss': 2.284235715866089, 'acc': 0.1875, 'step': 10},\n",
       "  {'loss': 2.3019700050354004, 'acc': 0.125, 'step': 11},\n",
       "  {'loss': 2.2832190990448, 'acc': 0.125, 'step': 12},\n",
       "  {'loss': 2.2876739501953125, 'acc': 0.09375, 'step': 13},\n",
       "  {'loss': 2.2790768146514893, 'acc': 0.15625, 'step': 14},\n",
       "  {'loss': 2.2814862728118896, 'acc': 0.1875, 'step': 15},\n",
       "  {'loss': 2.290466547012329, 'acc': 0.09375, 'step': 16},\n",
       "  {'loss': 2.295332908630371, 'acc': 0.09375, 'step': 17},\n",
       "  {'loss': 2.2848522663116455, 'acc': 0.09375, 'step': 18},\n",
       "  {'loss': 2.2900092601776123, 'acc': 0.15625, 'step': 19},\n",
       "  {'loss': 2.281860113143921, 'acc': 0.125, 'step': 20},\n",
       "  {'loss': 2.2671751976013184, 'acc': 0.21875, 'step': 21},\n",
       "  {'loss': 2.257185697555542, 'acc': 0.25, 'step': 22},\n",
       "  {'loss': 2.2461252212524414, 'acc': 0.1875, 'step': 23},\n",
       "  {'loss': 2.2938554286956787, 'acc': 0.0625, 'step': 24},\n",
       "  {'loss': 2.2784852981567383, 'acc': 0.0625, 'step': 25},\n",
       "  {'loss': 2.2753121852874756, 'acc': 0.09375, 'step': 26},\n",
       "  {'loss': 2.270721673965454, 'acc': 0.09375, 'step': 27},\n",
       "  {'loss': 2.2837510108947754, 'acc': 0.1875, 'step': 28},\n",
       "  {'loss': 2.273320198059082, 'acc': 0.09375, 'step': 29},\n",
       "  {'loss': 2.269035816192627, 'acc': 0.15625, 'step': 30},\n",
       "  {'loss': 2.2827115058898926, 'acc': 0.15625, 'step': 31},\n",
       "  {'loss': 2.2849414348602295, 'acc': 0.15625, 'step': 32},\n",
       "  {'loss': 2.250641107559204, 'acc': 0.28125, 'step': 33},\n",
       "  {'loss': 2.2577905654907227, 'acc': 0.1875, 'step': 34},\n",
       "  {'loss': 2.255493402481079, 'acc': 0.09375, 'step': 35},\n",
       "  {'loss': 2.2798779010772705, 'acc': 0.0625, 'step': 36},\n",
       "  {'loss': 2.2678396701812744, 'acc': 0.125, 'step': 37},\n",
       "  {'loss': 2.2607266902923584, 'acc': 0.1875, 'step': 38},\n",
       "  {'loss': 2.2542672157287598, 'acc': 0.09375, 'step': 39},\n",
       "  {'loss': 2.260890483856201, 'acc': 0.28125, 'step': 40},\n",
       "  {'loss': 2.272200345993042, 'acc': 0.0625, 'step': 41},\n",
       "  {'loss': 2.2676339149475098, 'acc': 0.21875, 'step': 42},\n",
       "  {'loss': 2.262289047241211, 'acc': 0.1875, 'step': 43},\n",
       "  {'loss': 2.265547037124634, 'acc': 0.1875, 'step': 44},\n",
       "  {'loss': 2.2548625469207764, 'acc': 0.3125, 'step': 45},\n",
       "  {'loss': 2.255584955215454, 'acc': 0.21875, 'step': 46},\n",
       "  {'loss': 2.2498836517333984, 'acc': 0.3125, 'step': 47},\n",
       "  {'loss': 2.2510321140289307, 'acc': 0.28125, 'step': 48},\n",
       "  {'loss': 2.2455251216888428, 'acc': 0.1875, 'step': 49},\n",
       "  {'loss': 2.259629011154175, 'acc': 0.15625, 'step': 50},\n",
       "  {'loss': 2.244102954864502, 'acc': 0.25, 'step': 51},\n",
       "  {'loss': 2.258838653564453, 'acc': 0.15625, 'step': 52},\n",
       "  {'loss': 2.2474188804626465, 'acc': 0.25, 'step': 53},\n",
       "  {'loss': 2.2529797554016113, 'acc': 0.25, 'step': 54},\n",
       "  {'loss': 2.2547948360443115, 'acc': 0.28125, 'step': 55},\n",
       "  {'loss': 2.2421064376831055, 'acc': 0.21875, 'step': 56},\n",
       "  {'loss': 2.226516008377075, 'acc': 0.3125, 'step': 57},\n",
       "  {'loss': 2.217101812362671, 'acc': 0.375, 'step': 58},\n",
       "  {'loss': 2.278874158859253, 'acc': 0.09375, 'step': 59},\n",
       "  {'loss': 2.223511219024658, 'acc': 0.25, 'step': 60},\n",
       "  {'loss': 2.239670515060425, 'acc': 0.25, 'step': 61},\n",
       "  {'loss': 2.2265853881835938, 'acc': 0.21875, 'step': 62},\n",
       "  {'loss': 2.258465051651001, 'acc': 0.25, 'step': 63},\n",
       "  {'loss': 2.2574448585510254, 'acc': 0.3125, 'step': 64},\n",
       "  {'loss': 2.2488598823547363, 'acc': 0.25, 'step': 65},\n",
       "  {'loss': 2.2630014419555664, 'acc': 0.09375, 'step': 66},\n",
       "  {'loss': 2.244135856628418, 'acc': 0.3125, 'step': 67},\n",
       "  {'loss': 2.2353224754333496, 'acc': 0.15625, 'step': 68},\n",
       "  {'loss': 2.229832410812378, 'acc': 0.21875, 'step': 69},\n",
       "  {'loss': 2.242145538330078, 'acc': 0.25, 'step': 70},\n",
       "  {'loss': 2.2482903003692627, 'acc': 0.1875, 'step': 71},\n",
       "  {'loss': 2.233704090118408, 'acc': 0.125, 'step': 72},\n",
       "  {'loss': 2.1937623023986816, 'acc': 0.34375, 'step': 73},\n",
       "  {'loss': 2.2067909240722656, 'acc': 0.34375, 'step': 74},\n",
       "  {'loss': 2.2389299869537354, 'acc': 0.28125, 'step': 75},\n",
       "  {'loss': 2.2282047271728516, 'acc': 0.4375, 'step': 76},\n",
       "  {'loss': 2.2323315143585205, 'acc': 0.1875, 'step': 77},\n",
       "  {'loss': 2.2232649326324463, 'acc': 0.40625, 'step': 78},\n",
       "  {'loss': 2.2195637226104736, 'acc': 0.25, 'step': 79},\n",
       "  {'loss': 2.240388870239258, 'acc': 0.25, 'step': 80},\n",
       "  {'loss': 2.2208895683288574, 'acc': 0.28125, 'step': 81},\n",
       "  {'loss': 2.2108964920043945, 'acc': 0.4375, 'step': 82},\n",
       "  {'loss': 2.223008871078491, 'acc': 0.28125, 'step': 83},\n",
       "  {'loss': 2.2174346446990967, 'acc': 0.375, 'step': 84},\n",
       "  {'loss': 2.205118417739868, 'acc': 0.40625, 'step': 85},\n",
       "  {'loss': 2.228661060333252, 'acc': 0.21875, 'step': 86},\n",
       "  {'loss': 2.227710723876953, 'acc': 0.15625, 'step': 87},\n",
       "  {'loss': 2.234440803527832, 'acc': 0.3125, 'step': 88},\n",
       "  {'loss': 2.2006819248199463, 'acc': 0.375, 'step': 89},\n",
       "  {'loss': 2.2448582649230957, 'acc': 0.21875, 'step': 90},\n",
       "  {'loss': 2.1820597648620605, 'acc': 0.4375, 'step': 91},\n",
       "  {'loss': 2.2078373432159424, 'acc': 0.375, 'step': 92},\n",
       "  {'loss': 2.1887919902801514, 'acc': 0.4375, 'step': 93},\n",
       "  {'loss': 2.2237586975097656, 'acc': 0.40625, 'step': 94},\n",
       "  {'loss': 2.199369430541992, 'acc': 0.375, 'step': 95},\n",
       "  {'loss': 2.168700695037842, 'acc': 0.46875, 'step': 96},\n",
       "  {'loss': 2.1854207515716553, 'acc': 0.40625, 'step': 97},\n",
       "  {'loss': 2.19362735748291, 'acc': 0.28125, 'step': 98},\n",
       "  {'loss': 2.1909430027008057, 'acc': 0.46875, 'step': 99},\n",
       "  {'loss': 2.1644742488861084, 'acc': 0.4375, 'step': 100},\n",
       "  {'loss': 2.184100866317749, 'acc': 0.46875, 'step': 101},\n",
       "  {'loss': 2.175189256668091, 'acc': 0.3125, 'step': 102},\n",
       "  {'loss': 2.1919546127319336, 'acc': 0.34375, 'step': 103},\n",
       "  {'loss': 2.2026877403259277, 'acc': 0.4375, 'step': 104},\n",
       "  {'loss': 2.1979575157165527, 'acc': 0.3125, 'step': 105},\n",
       "  {'loss': 2.182128429412842, 'acc': 0.3125, 'step': 106},\n",
       "  {'loss': 2.1436920166015625, 'acc': 0.40625, 'step': 107},\n",
       "  {'loss': 2.156296968460083, 'acc': 0.375, 'step': 108},\n",
       "  {'loss': 2.219255208969116, 'acc': 0.1875, 'step': 109},\n",
       "  {'loss': 2.1815402507781982, 'acc': 0.4375, 'step': 110},\n",
       "  {'loss': 2.2031407356262207, 'acc': 0.28125, 'step': 111},\n",
       "  {'loss': 2.213322877883911, 'acc': 0.28125, 'step': 112},\n",
       "  {'loss': 2.158220052719116, 'acc': 0.40625, 'step': 113},\n",
       "  {'loss': 2.1862289905548096, 'acc': 0.3125, 'step': 114},\n",
       "  {'loss': 2.1945483684539795, 'acc': 0.3125, 'step': 115},\n",
       "  {'loss': 2.1704788208007812, 'acc': 0.40625, 'step': 116},\n",
       "  {'loss': 2.1320242881774902, 'acc': 0.4375, 'step': 117},\n",
       "  {'loss': 2.198028564453125, 'acc': 0.28125, 'step': 118},\n",
       "  {'loss': 2.180241584777832, 'acc': 0.25, 'step': 119},\n",
       "  {'loss': 2.168307065963745, 'acc': 0.34375, 'step': 120},\n",
       "  {'loss': 2.166801691055298, 'acc': 0.40625, 'step': 121},\n",
       "  {'loss': 2.1662955284118652, 'acc': 0.375, 'step': 122},\n",
       "  {'loss': 2.12019944190979, 'acc': 0.34375, 'step': 123},\n",
       "  {'loss': 2.146554946899414, 'acc': 0.3125, 'step': 124},\n",
       "  {'loss': 2.1239237785339355, 'acc': 0.5, 'step': 125},\n",
       "  {'loss': 2.1575686931610107, 'acc': 0.28125, 'step': 126},\n",
       "  {'loss': 2.1247637271881104, 'acc': 0.40625, 'step': 127},\n",
       "  {'loss': 2.161539077758789, 'acc': 0.28125, 'step': 128},\n",
       "  {'loss': 2.1260039806365967, 'acc': 0.4375, 'step': 129},\n",
       "  {'loss': 2.097181558609009, 'acc': 0.3125, 'step': 130},\n",
       "  {'loss': 2.1050519943237305, 'acc': 0.40625, 'step': 131},\n",
       "  {'loss': 2.1439619064331055, 'acc': 0.40625, 'step': 132},\n",
       "  {'loss': 2.1228597164154053, 'acc': 0.375, 'step': 133},\n",
       "  {'loss': 2.1620590686798096, 'acc': 0.28125, 'step': 134},\n",
       "  {'loss': 2.1715924739837646, 'acc': 0.25, 'step': 135},\n",
       "  {'loss': 2.143686532974243, 'acc': 0.4375, 'step': 136},\n",
       "  {'loss': 2.1243810653686523, 'acc': 0.40625, 'step': 137},\n",
       "  {'loss': 2.1203041076660156, 'acc': 0.375, 'step': 138},\n",
       "  {'loss': 2.1473567485809326, 'acc': 0.25, 'step': 139},\n",
       "  {'loss': 2.1513242721557617, 'acc': 0.28125, 'step': 140},\n",
       "  {'loss': 2.097337245941162, 'acc': 0.53125, 'step': 141},\n",
       "  {'loss': 2.138988971710205, 'acc': 0.3125, 'step': 142},\n",
       "  {'loss': 2.137420177459717, 'acc': 0.40625, 'step': 143},\n",
       "  {'loss': 2.1472883224487305, 'acc': 0.1875, 'step': 144},\n",
       "  {'loss': 2.151207447052002, 'acc': 0.15625, 'step': 145},\n",
       "  {'loss': 2.1461341381073, 'acc': 0.21875, 'step': 146},\n",
       "  {'loss': 2.109574794769287, 'acc': 0.25, 'step': 147},\n",
       "  {'loss': 2.1102123260498047, 'acc': 0.40625, 'step': 148},\n",
       "  {'loss': 2.1073741912841797, 'acc': 0.375, 'step': 149},\n",
       "  {'loss': 2.1538984775543213, 'acc': 0.25, 'step': 150},\n",
       "  {'loss': 2.1272547245025635, 'acc': 0.28125, 'step': 151},\n",
       "  {'loss': 2.1341750621795654, 'acc': 0.21875, 'step': 152},\n",
       "  {'loss': 2.0985045433044434, 'acc': 0.375, 'step': 153},\n",
       "  {'loss': 2.1342413425445557, 'acc': 0.34375, 'step': 154},\n",
       "  {'loss': 2.080070972442627, 'acc': 0.34375, 'step': 155},\n",
       "  {'loss': 2.027113199234009, 'acc': 0.5625, 'step': 156},\n",
       "  {'loss': 2.0652589797973633, 'acc': 0.40625, 'step': 157},\n",
       "  {'loss': 2.0998103618621826, 'acc': 0.4375, 'step': 158},\n",
       "  {'loss': 2.102431535720825, 'acc': 0.40625, 'step': 159},\n",
       "  {'loss': 2.0768346786499023, 'acc': 0.46875, 'step': 160},\n",
       "  {'loss': 2.03714919090271, 'acc': 0.5625, 'step': 161},\n",
       "  {'loss': 2.0734217166900635, 'acc': 0.46875, 'step': 162},\n",
       "  {'loss': 2.0921664237976074, 'acc': 0.375, 'step': 163},\n",
       "  {'loss': 2.0964038372039795, 'acc': 0.375, 'step': 164},\n",
       "  {'loss': 2.1034345626831055, 'acc': 0.40625, 'step': 165},\n",
       "  {'loss': 2.0303280353546143, 'acc': 0.5, 'step': 166},\n",
       "  {'loss': 2.0925748348236084, 'acc': 0.375, 'step': 167},\n",
       "  {'loss': 2.1391077041625977, 'acc': 0.3125, 'step': 168},\n",
       "  {'loss': 2.096982002258301, 'acc': 0.40625, 'step': 169},\n",
       "  {'loss': 2.1053671836853027, 'acc': 0.3125, 'step': 170},\n",
       "  {'loss': 2.0539214611053467, 'acc': 0.40625, 'step': 171},\n",
       "  {'loss': 2.0665690898895264, 'acc': 0.375, 'step': 172},\n",
       "  {'loss': 2.061922788619995, 'acc': 0.4375, 'step': 173},\n",
       "  {'loss': 2.0912601947784424, 'acc': 0.375, 'step': 174},\n",
       "  {'loss': 2.0980305671691895, 'acc': 0.34375, 'step': 175},\n",
       "  {'loss': 2.0230703353881836, 'acc': 0.46875, 'step': 176},\n",
       "  {'loss': 2.0688579082489014, 'acc': 0.34375, 'step': 177},\n",
       "  {'loss': 1.998049020767212, 'acc': 0.4375, 'step': 178},\n",
       "  {'loss': 2.077353000640869, 'acc': 0.4375, 'step': 179},\n",
       "  {'loss': 2.0967702865600586, 'acc': 0.3125, 'step': 180},\n",
       "  {'loss': 2.0062332153320312, 'acc': 0.375, 'step': 181},\n",
       "  {'loss': 2.0860276222229004, 'acc': 0.28125, 'step': 182},\n",
       "  {'loss': 2.1269659996032715, 'acc': 0.40625, 'step': 183},\n",
       "  {'loss': 1.97502601146698, 'acc': 0.59375, 'step': 184},\n",
       "  {'loss': 1.9795236587524414, 'acc': 0.46875, 'step': 185},\n",
       "  {'loss': 2.0537972450256348, 'acc': 0.34375, 'step': 186},\n",
       "  {'loss': 2.064601421356201, 'acc': 0.40625, 'step': 187},\n",
       "  {'loss': 2.0516083240509033, 'acc': 0.53125, 'step': 188},\n",
       "  {'loss': 2.0061495304107666, 'acc': 0.5, 'step': 189},\n",
       "  {'loss': 2.0618069171905518, 'acc': 0.5625, 'step': 190},\n",
       "  {'loss': 2.0518836975097656, 'acc': 0.40625, 'step': 191},\n",
       "  {'loss': 1.9852960109710693, 'acc': 0.5625, 'step': 192},\n",
       "  {'loss': 1.9809006452560425, 'acc': 0.5, 'step': 193},\n",
       "  {'loss': 1.9967678785324097, 'acc': 0.40625, 'step': 194},\n",
       "  {'loss': 2.016444206237793, 'acc': 0.625, 'step': 195},\n",
       "  {'loss': 1.970231056213379, 'acc': 0.5, 'step': 196},\n",
       "  {'loss': 2.0080478191375732, 'acc': 0.375, 'step': 197},\n",
       "  {'loss': 2.041532516479492, 'acc': 0.4375, 'step': 198},\n",
       "  {'loss': 2.0143892765045166, 'acc': 0.4375, 'step': 199},\n",
       "  {'loss': 1.950447916984558, 'acc': 0.625, 'step': 200},\n",
       "  {'loss': 1.9676806926727295, 'acc': 0.53125, 'step': 201},\n",
       "  {'loss': 2.0228240489959717, 'acc': 0.3125, 'step': 202},\n",
       "  {'loss': 1.9777851104736328, 'acc': 0.5, 'step': 203},\n",
       "  {'loss': 1.914703369140625, 'acc': 0.46875, 'step': 204},\n",
       "  {'loss': 1.9954856634140015, 'acc': 0.375, 'step': 205},\n",
       "  {'loss': 2.0141801834106445, 'acc': 0.375, 'step': 206},\n",
       "  {'loss': 1.8948512077331543, 'acc': 0.65625, 'step': 207},\n",
       "  {'loss': 2.0243122577667236, 'acc': 0.53125, 'step': 208},\n",
       "  {'loss': 1.9902116060256958, 'acc': 0.40625, 'step': 209},\n",
       "  {'loss': 1.8783800601959229, 'acc': 0.5625, 'step': 210},\n",
       "  {'loss': 1.977250576019287, 'acc': 0.40625, 'step': 211},\n",
       "  {'loss': 1.9840521812438965, 'acc': 0.4375, 'step': 212},\n",
       "  {'loss': 2.003800392150879, 'acc': 0.40625, 'step': 213},\n",
       "  {'loss': 2.0252912044525146, 'acc': 0.28125, 'step': 214},\n",
       "  {'loss': 2.0099024772644043, 'acc': 0.375, 'step': 215},\n",
       "  {'loss': 1.9364957809448242, 'acc': 0.53125, 'step': 216},\n",
       "  {'loss': 1.9532660245895386, 'acc': 0.5, 'step': 217},\n",
       "  {'loss': 1.914129614830017, 'acc': 0.46875, 'step': 218},\n",
       "  {'loss': 1.9156118631362915, 'acc': 0.59375, 'step': 219},\n",
       "  {'loss': 1.9559694528579712, 'acc': 0.53125, 'step': 220},\n",
       "  {'loss': 1.9814784526824951, 'acc': 0.28125, 'step': 221},\n",
       "  {'loss': 1.924251914024353, 'acc': 0.5, 'step': 222},\n",
       "  {'loss': 1.930343508720398, 'acc': 0.5, 'step': 223},\n",
       "  {'loss': 1.9554846286773682, 'acc': 0.625, 'step': 224},\n",
       "  {'loss': 1.9615932703018188, 'acc': 0.40625, 'step': 225},\n",
       "  {'loss': 1.9658459424972534, 'acc': 0.40625, 'step': 226},\n",
       "  {'loss': 1.803415298461914, 'acc': 0.65625, 'step': 227},\n",
       "  {'loss': 1.9154657125473022, 'acc': 0.46875, 'step': 228},\n",
       "  {'loss': 1.9639341831207275, 'acc': 0.34375, 'step': 229},\n",
       "  {'loss': 1.918764591217041, 'acc': 0.53125, 'step': 230},\n",
       "  {'loss': 1.9297643899917603, 'acc': 0.46875, 'step': 231},\n",
       "  {'loss': 1.9254199266433716, 'acc': 0.5625, 'step': 232},\n",
       "  {'loss': 1.907151460647583, 'acc': 0.4375, 'step': 233},\n",
       "  {'loss': 1.834349274635315, 'acc': 0.5625, 'step': 234},\n",
       "  {'loss': 1.8803763389587402, 'acc': 0.46875, 'step': 235},\n",
       "  {'loss': 1.9856538772583008, 'acc': 0.40625, 'step': 236},\n",
       "  {'loss': 1.8745768070220947, 'acc': 0.5625, 'step': 237},\n",
       "  {'loss': 1.8967312574386597, 'acc': 0.40625, 'step': 238},\n",
       "  {'loss': 1.87269926071167, 'acc': 0.40625, 'step': 239},\n",
       "  {'loss': 1.8729134798049927, 'acc': 0.4375, 'step': 240},\n",
       "  {'loss': 1.8705403804779053, 'acc': 0.5625, 'step': 241},\n",
       "  {'loss': 1.9041776657104492, 'acc': 0.34375, 'step': 242},\n",
       "  {'loss': 1.8723143339157104, 'acc': 0.5625, 'step': 243},\n",
       "  {'loss': 1.9365204572677612, 'acc': 0.5, 'step': 244},\n",
       "  {'loss': 1.7965586185455322, 'acc': 0.5625, 'step': 245},\n",
       "  {'loss': 1.7862416505813599, 'acc': 0.59375, 'step': 246},\n",
       "  {'loss': 1.792346715927124, 'acc': 0.59375, 'step': 247},\n",
       "  {'loss': 1.8175941705703735, 'acc': 0.625, 'step': 248},\n",
       "  {'loss': 1.8737940788269043, 'acc': 0.5, 'step': 249},\n",
       "  {'loss': 1.92315673828125, 'acc': 0.46875, 'step': 250},\n",
       "  {'loss': 1.846680760383606, 'acc': 0.625, 'step': 251},\n",
       "  {'loss': 1.8026000261306763, 'acc': 0.59375, 'step': 252},\n",
       "  {'loss': 1.7960882186889648, 'acc': 0.625, 'step': 253},\n",
       "  {'loss': 1.776515245437622, 'acc': 0.75, 'step': 254},\n",
       "  {'loss': 1.9659677743911743, 'acc': 0.46875, 'step': 255},\n",
       "  {'loss': 1.7577723264694214, 'acc': 0.625, 'step': 256},\n",
       "  {'loss': 1.7901147603988647, 'acc': 0.59375, 'step': 257},\n",
       "  {'loss': 1.8347851037979126, 'acc': 0.5, 'step': 258},\n",
       "  {'loss': 1.8728095293045044, 'acc': 0.46875, 'step': 259},\n",
       "  {'loss': 1.816892385482788, 'acc': 0.5625, 'step': 260},\n",
       "  {'loss': 1.9223016500473022, 'acc': 0.5, 'step': 261},\n",
       "  {'loss': 1.769484043121338, 'acc': 0.4375, 'step': 262},\n",
       "  {'loss': 1.8170779943466187, 'acc': 0.46875, 'step': 263},\n",
       "  {'loss': 1.7119899988174438, 'acc': 0.5, 'step': 264},\n",
       "  {'loss': 1.891114592552185, 'acc': 0.46875, 'step': 265},\n",
       "  {'loss': 1.7616217136383057, 'acc': 0.625, 'step': 266},\n",
       "  {'loss': 1.7470558881759644, 'acc': 0.4375, 'step': 267},\n",
       "  {'loss': 1.8780372142791748, 'acc': 0.5, 'step': 268},\n",
       "  {'loss': 1.6954278945922852, 'acc': 0.53125, 'step': 269},\n",
       "  {'loss': 1.695682168006897, 'acc': 0.625, 'step': 270},\n",
       "  {'loss': 1.835624098777771, 'acc': 0.46875, 'step': 271},\n",
       "  {'loss': 1.830541968345642, 'acc': 0.46875, 'step': 272},\n",
       "  {'loss': 1.78688645362854, 'acc': 0.5, 'step': 273},\n",
       "  {'loss': 1.7175064086914062, 'acc': 0.5, 'step': 274},\n",
       "  {'loss': 1.710298776626587, 'acc': 0.5, 'step': 275},\n",
       "  {'loss': 1.7145965099334717, 'acc': 0.5, 'step': 276},\n",
       "  {'loss': 1.79285728931427, 'acc': 0.46875, 'step': 277},\n",
       "  {'loss': 1.6843677759170532, 'acc': 0.65625, 'step': 278},\n",
       "  {'loss': 1.7469115257263184, 'acc': 0.59375, 'step': 279},\n",
       "  {'loss': 1.9559943675994873, 'acc': 0.25, 'step': 280},\n",
       "  {'loss': 1.6658358573913574, 'acc': 0.5625, 'step': 281},\n",
       "  {'loss': 1.8032784461975098, 'acc': 0.40625, 'step': 282},\n",
       "  {'loss': 1.729372501373291, 'acc': 0.4375, 'step': 283},\n",
       "  {'loss': 1.7941941022872925, 'acc': 0.46875, 'step': 284},\n",
       "  {'loss': 1.8009872436523438, 'acc': 0.46875, 'step': 285},\n",
       "  {'loss': 1.7915211915969849, 'acc': 0.3125, 'step': 286},\n",
       "  {'loss': 1.7550370693206787, 'acc': 0.34375, 'step': 287},\n",
       "  {'loss': 1.7306407690048218, 'acc': 0.4375, 'step': 288},\n",
       "  {'loss': 1.7166141271591187, 'acc': 0.5, 'step': 289},\n",
       "  {'loss': 1.618072748184204, 'acc': 0.5, 'step': 290},\n",
       "  {'loss': 1.718520164489746, 'acc': 0.5, 'step': 291},\n",
       "  {'loss': 1.811098575592041, 'acc': 0.375, 'step': 292},\n",
       "  {'loss': 1.667081594467163, 'acc': 0.375, 'step': 293},\n",
       "  {'loss': 1.7185202836990356, 'acc': 0.5625, 'step': 294},\n",
       "  {'loss': 1.818180799484253, 'acc': 0.375, 'step': 295},\n",
       "  {'loss': 1.7102147340774536, 'acc': 0.53125, 'step': 296},\n",
       "  {'loss': 1.8672103881835938, 'acc': 0.4375, 'step': 297},\n",
       "  {'loss': 1.6907378435134888, 'acc': 0.4375, 'step': 298},\n",
       "  {'loss': 1.6791094541549683, 'acc': 0.4375, 'step': 299},\n",
       "  {'loss': 1.674846887588501, 'acc': 0.59375, 'step': 300},\n",
       "  {'loss': 1.6897274255752563, 'acc': 0.5625, 'step': 301},\n",
       "  {'loss': 1.6458826065063477, 'acc': 0.53125, 'step': 302},\n",
       "  {'loss': 1.7653735876083374, 'acc': 0.53125, 'step': 303},\n",
       "  {'loss': 1.7374190092086792, 'acc': 0.59375, 'step': 304},\n",
       "  {'loss': 1.610801339149475, 'acc': 0.53125, 'step': 305},\n",
       "  {'loss': 1.613450527191162, 'acc': 0.6875, 'step': 306},\n",
       "  {'loss': 1.5668855905532837, 'acc': 0.5625, 'step': 307},\n",
       "  {'loss': 1.803683876991272, 'acc': 0.4375, 'step': 308},\n",
       "  {'loss': 1.671711802482605, 'acc': 0.59375, 'step': 309},\n",
       "  {'loss': 1.7300844192504883, 'acc': 0.5, 'step': 310},\n",
       "  {'loss': 1.6039314270019531, 'acc': 0.5, 'step': 311},\n",
       "  {'loss': 1.613364577293396, 'acc': 0.53125, 'step': 312},\n",
       "  {'loss': 1.600015640258789, 'acc': 0.59375, 'step': 313},\n",
       "  {'loss': 1.7213431596755981, 'acc': 0.28125, 'step': 314},\n",
       "  {'loss': 1.4841506481170654, 'acc': 0.59375, 'step': 315},\n",
       "  {'loss': 1.6343952417373657, 'acc': 0.46875, 'step': 316},\n",
       "  {'loss': 1.6456913948059082, 'acc': 0.34375, 'step': 317},\n",
       "  {'loss': 1.7600610256195068, 'acc': 0.3125, 'step': 318},\n",
       "  {'loss': 1.6957486867904663, 'acc': 0.65625, 'step': 319},\n",
       "  {'loss': 1.5947741270065308, 'acc': 0.5625, 'step': 320},\n",
       "  {'loss': 1.7181036472320557, 'acc': 0.4375, 'step': 321},\n",
       "  {'loss': 1.5455420017242432, 'acc': 0.59375, 'step': 322},\n",
       "  {'loss': 1.6682173013687134, 'acc': 0.5, 'step': 323},\n",
       "  {'loss': 1.5515574216842651, 'acc': 0.59375, 'step': 324},\n",
       "  {'loss': 1.6413737535476685, 'acc': 0.5625, 'step': 325},\n",
       "  {'loss': 1.6426275968551636, 'acc': 0.5625, 'step': 326},\n",
       "  {'loss': 1.5013715028762817, 'acc': 0.53125, 'step': 327},\n",
       "  {'loss': 1.564536452293396, 'acc': 0.53125, 'step': 328},\n",
       "  {'loss': 1.6347302198410034, 'acc': 0.5625, 'step': 329},\n",
       "  {'loss': 1.6469234228134155, 'acc': 0.4375, 'step': 330},\n",
       "  {'loss': 1.5225098133087158, 'acc': 0.6875, 'step': 331},\n",
       "  {'loss': 1.4857815504074097, 'acc': 0.5625, 'step': 332},\n",
       "  {'loss': 1.6037349700927734, 'acc': 0.40625, 'step': 333},\n",
       "  {'loss': 1.4945350885391235, 'acc': 0.59375, 'step': 334},\n",
       "  {'loss': 1.62832772731781, 'acc': 0.5, 'step': 335},\n",
       "  {'loss': 1.7056442499160767, 'acc': 0.34375, 'step': 336},\n",
       "  {'loss': 1.5915883779525757, 'acc': 0.53125, 'step': 337},\n",
       "  {'loss': 1.601718544960022, 'acc': 0.59375, 'step': 338},\n",
       "  {'loss': 1.6239359378814697, 'acc': 0.53125, 'step': 339},\n",
       "  {'loss': 1.5102252960205078, 'acc': 0.59375, 'step': 340},\n",
       "  {'loss': 1.4929120540618896, 'acc': 0.53125, 'step': 341},\n",
       "  {'loss': 1.5425517559051514, 'acc': 0.625, 'step': 342},\n",
       "  {'loss': 1.6305513381958008, 'acc': 0.5625, 'step': 343},\n",
       "  {'loss': 1.582030177116394, 'acc': 0.53125, 'step': 344},\n",
       "  {'loss': 1.4602656364440918, 'acc': 0.625, 'step': 345},\n",
       "  {'loss': 1.5610105991363525, 'acc': 0.375, 'step': 346},\n",
       "  {'loss': 1.5136908292770386, 'acc': 0.53125, 'step': 347},\n",
       "  {'loss': 1.7431306838989258, 'acc': 0.46875, 'step': 348},\n",
       "  {'loss': 1.4819469451904297, 'acc': 0.40625, 'step': 349},\n",
       "  {'loss': 1.4283913373947144, 'acc': 0.5625, 'step': 350},\n",
       "  {'loss': 1.6169242858886719, 'acc': 0.5625, 'step': 351},\n",
       "  {'loss': 1.5321773290634155, 'acc': 0.5, 'step': 352},\n",
       "  {'loss': 1.619009017944336, 'acc': 0.46875, 'step': 353},\n",
       "  {'loss': 1.5367989540100098, 'acc': 0.53125, 'step': 354},\n",
       "  {'loss': 1.4926719665527344, 'acc': 0.65625, 'step': 355},\n",
       "  {'loss': 1.4477217197418213, 'acc': 0.625, 'step': 356},\n",
       "  {'loss': 1.6094715595245361, 'acc': 0.53125, 'step': 357},\n",
       "  {'loss': 1.5458753108978271, 'acc': 0.59375, 'step': 358},\n",
       "  {'loss': 1.5961642265319824, 'acc': 0.53125, 'step': 359},\n",
       "  {'loss': 1.5672893524169922, 'acc': 0.59375, 'step': 360},\n",
       "  {'loss': 1.3127923011779785, 'acc': 0.8125, 'step': 361},\n",
       "  {'loss': 1.491326093673706, 'acc': 0.625, 'step': 362},\n",
       "  {'loss': 1.370423674583435, 'acc': 0.59375, 'step': 363},\n",
       "  {'loss': 1.404011845588684, 'acc': 0.625, 'step': 364},\n",
       "  {'loss': 1.3816699981689453, 'acc': 0.625, 'step': 365},\n",
       "  {'loss': 1.7337586879730225, 'acc': 0.40625, 'step': 366},\n",
       "  {'loss': 1.5994271039962769, 'acc': 0.53125, 'step': 367},\n",
       "  {'loss': 1.379755973815918, 'acc': 0.5625, 'step': 368},\n",
       "  {'loss': 1.5174421072006226, 'acc': 0.625, 'step': 369},\n",
       "  {'loss': 1.4554927349090576, 'acc': 0.71875, 'step': 370},\n",
       "  {'loss': 1.6447269916534424, 'acc': 0.4375, 'step': 371},\n",
       "  {'loss': 1.4200611114501953, 'acc': 0.65625, 'step': 372},\n",
       "  {'loss': 1.5494637489318848, 'acc': 0.5625, 'step': 373},\n",
       "  {'loss': 1.4458729028701782, 'acc': 0.5625, 'step': 374},\n",
       "  {'loss': 1.44692862033844, 'acc': 0.625, 'step': 375},\n",
       "  {'loss': 1.4326388835906982, 'acc': 0.59375, 'step': 376},\n",
       "  {'loss': 1.3125665187835693, 'acc': 0.875, 'step': 377},\n",
       "  {'loss': 1.50479257106781, 'acc': 0.5625, 'step': 378},\n",
       "  {'loss': 1.3543164730072021, 'acc': 0.65625, 'step': 379},\n",
       "  {'loss': 1.4365870952606201, 'acc': 0.65625, 'step': 380},\n",
       "  {'loss': 1.5386544466018677, 'acc': 0.59375, 'step': 381},\n",
       "  {'loss': 1.4516299962997437, 'acc': 0.46875, 'step': 382},\n",
       "  {'loss': 1.3825350999832153, 'acc': 0.65625, 'step': 383},\n",
       "  {'loss': 1.4396026134490967, 'acc': 0.59375, 'step': 384},\n",
       "  {'loss': 1.348879337310791, 'acc': 0.75, 'step': 385},\n",
       "  {'loss': 1.4190644025802612, 'acc': 0.65625, 'step': 386},\n",
       "  {'loss': 1.3788124322891235, 'acc': 0.625, 'step': 387},\n",
       "  {'loss': 1.513214111328125, 'acc': 0.5, 'step': 388},\n",
       "  {'loss': 1.3855416774749756, 'acc': 0.5625, 'step': 389},\n",
       "  {'loss': 1.450429081916809, 'acc': 0.65625, 'step': 390},\n",
       "  {'loss': 1.5085283517837524, 'acc': 0.59375, 'step': 391},\n",
       "  {'loss': 1.458911418914795, 'acc': 0.46875, 'step': 392},\n",
       "  {'loss': 1.3131941556930542, 'acc': 0.65625, 'step': 393},\n",
       "  {'loss': 1.3510444164276123, 'acc': 0.71875, 'step': 394},\n",
       "  {'loss': 1.3609477281570435, 'acc': 0.71875, 'step': 395},\n",
       "  {'loss': 1.2790982723236084, 'acc': 0.78125, 'step': 396},\n",
       "  {'loss': 1.4462437629699707, 'acc': 0.5625, 'step': 397},\n",
       "  {'loss': 1.2071259021759033, 'acc': 0.75, 'step': 398},\n",
       "  {'loss': 1.4816802740097046, 'acc': 0.53125, 'step': 399},\n",
       "  {'loss': 1.5300910472869873, 'acc': 0.59375, 'step': 400},\n",
       "  {'loss': 1.3451879024505615, 'acc': 0.71875, 'step': 401},\n",
       "  {'loss': 1.260211706161499, 'acc': 0.78125, 'step': 402},\n",
       "  {'loss': 1.38747239112854, 'acc': 0.71875, 'step': 403},\n",
       "  {'loss': 1.3628212213516235, 'acc': 0.59375, 'step': 404},\n",
       "  {'loss': 1.2867763042449951, 'acc': 0.625, 'step': 405},\n",
       "  {'loss': 1.334228754043579, 'acc': 0.71875, 'step': 406},\n",
       "  {'loss': 1.2158337831497192, 'acc': 0.8125, 'step': 407},\n",
       "  {'loss': 1.4125396013259888, 'acc': 0.625, 'step': 408},\n",
       "  {'loss': 1.4825962781906128, 'acc': 0.5625, 'step': 409},\n",
       "  {'loss': 1.3762223720550537, 'acc': 0.625, 'step': 410},\n",
       "  {'loss': 1.3476237058639526, 'acc': 0.65625, 'step': 411},\n",
       "  {'loss': 1.3517718315124512, 'acc': 0.65625, 'step': 412},\n",
       "  {'loss': 1.2439595460891724, 'acc': 0.75, 'step': 413},\n",
       "  {'loss': 1.2301075458526611, 'acc': 0.71875, 'step': 414},\n",
       "  {'loss': 1.2815942764282227, 'acc': 0.65625, 'step': 415},\n",
       "  {'loss': 1.2445236444473267, 'acc': 0.65625, 'step': 416},\n",
       "  {'loss': 1.291504144668579, 'acc': 0.6875, 'step': 417},\n",
       "  {'loss': 1.437045931816101, 'acc': 0.46875, 'step': 418},\n",
       "  {'loss': 1.3980653285980225, 'acc': 0.53125, 'step': 419},\n",
       "  {'loss': 1.3696123361587524, 'acc': 0.59375, 'step': 420},\n",
       "  {'loss': 1.2113569974899292, 'acc': 0.59375, 'step': 421},\n",
       "  {'loss': 1.213119387626648, 'acc': 0.6875, 'step': 422},\n",
       "  {'loss': 1.3531789779663086, 'acc': 0.5625, 'step': 423},\n",
       "  {'loss': 1.2121695280075073, 'acc': 0.59375, 'step': 424},\n",
       "  {'loss': 1.2412728071212769, 'acc': 0.625, 'step': 425},\n",
       "  {'loss': 1.2288305759429932, 'acc': 0.59375, 'step': 426},\n",
       "  {'loss': 1.2199976444244385, 'acc': 0.625, 'step': 427},\n",
       "  {'loss': 1.367122769355774, 'acc': 0.5, 'step': 428},\n",
       "  {'loss': 1.3468108177185059, 'acc': 0.5, 'step': 429},\n",
       "  {'loss': 1.3411706686019897, 'acc': 0.5, 'step': 430},\n",
       "  {'loss': 1.3275004625320435, 'acc': 0.59375, 'step': 431},\n",
       "  {'loss': 1.2066718339920044, 'acc': 0.65625, 'step': 432},\n",
       "  {'loss': 1.2076438665390015, 'acc': 0.65625, 'step': 433},\n",
       "  {'loss': 1.2225383520126343, 'acc': 0.5625, 'step': 434},\n",
       "  {'loss': 1.3632978200912476, 'acc': 0.5625, 'step': 435},\n",
       "  {'loss': 1.2839878797531128, 'acc': 0.65625, 'step': 436},\n",
       "  {'loss': 1.3376179933547974, 'acc': 0.59375, 'step': 437},\n",
       "  {'loss': 1.2212127447128296, 'acc': 0.625, 'step': 438},\n",
       "  {'loss': 1.4272838830947876, 'acc': 0.5, 'step': 439},\n",
       "  {'loss': 1.4164278507232666, 'acc': 0.5625, 'step': 440},\n",
       "  {'loss': 1.2512505054473877, 'acc': 0.59375, 'step': 441},\n",
       "  {'loss': 1.3415149450302124, 'acc': 0.46875, 'step': 442},\n",
       "  {'loss': 1.5405348539352417, 'acc': 0.375, 'step': 443},\n",
       "  {'loss': 1.4236431121826172, 'acc': 0.34375, 'step': 444},\n",
       "  {'loss': 1.1811386346817017, 'acc': 0.59375, 'step': 445},\n",
       "  {'loss': 1.1847394704818726, 'acc': 0.625, 'step': 446},\n",
       "  {'loss': 1.2587891817092896, 'acc': 0.59375, 'step': 447},\n",
       "  {'loss': 1.28082275390625, 'acc': 0.65625, 'step': 448},\n",
       "  {'loss': 1.1543203592300415, 'acc': 0.65625, 'step': 449},\n",
       "  {'loss': 1.2357550859451294, 'acc': 0.59375, 'step': 450},\n",
       "  {'loss': 1.2697334289550781, 'acc': 0.5625, 'step': 451},\n",
       "  {'loss': 1.4481486082077026, 'acc': 0.625, 'step': 452},\n",
       "  {'loss': 1.483423113822937, 'acc': 0.5, 'step': 453},\n",
       "  {'loss': 1.2028076648712158, 'acc': 0.59375, 'step': 454},\n",
       "  {'loss': 1.2533982992172241, 'acc': 0.625, 'step': 455},\n",
       "  {'loss': 1.2094101905822754, 'acc': 0.6875, 'step': 456},\n",
       "  {'loss': 1.1181068420410156, 'acc': 0.625, 'step': 457},\n",
       "  {'loss': 1.2808157205581665, 'acc': 0.53125, 'step': 458},\n",
       "  {'loss': 1.3516223430633545, 'acc': 0.625, 'step': 459},\n",
       "  {'loss': 1.2847057580947876, 'acc': 0.59375, 'step': 460},\n",
       "  {'loss': 1.213299036026001, 'acc': 0.53125, 'step': 461},\n",
       "  {'loss': 1.4788296222686768, 'acc': 0.40625, 'step': 462},\n",
       "  {'loss': 1.2160080671310425, 'acc': 0.625, 'step': 463},\n",
       "  {'loss': 1.3377996683120728, 'acc': 0.5, 'step': 464},\n",
       "  {'loss': 1.1959275007247925, 'acc': 0.71875, 'step': 465},\n",
       "  {'loss': 1.2798701524734497, 'acc': 0.65625, 'step': 466},\n",
       "  {'loss': 1.2759889364242554, 'acc': 0.75, 'step': 467},\n",
       "  {'loss': 1.3578109741210938, 'acc': 0.53125, 'step': 468},\n",
       "  {'loss': 1.1977086067199707, 'acc': 0.6875, 'step': 469},\n",
       "  {'loss': 1.455391764640808, 'acc': 0.5625, 'step': 470},\n",
       "  {'loss': 1.2297651767730713, 'acc': 0.59375, 'step': 471},\n",
       "  {'loss': 1.2570232152938843, 'acc': 0.5625, 'step': 472},\n",
       "  {'loss': 1.298311471939087, 'acc': 0.6875, 'step': 473},\n",
       "  {'loss': 1.2158814668655396, 'acc': 0.65625, 'step': 474},\n",
       "  {'loss': 1.0558747053146362, 'acc': 0.75, 'step': 475},\n",
       "  {'loss': 1.1508684158325195, 'acc': 0.71875, 'step': 476},\n",
       "  {'loss': 1.1770124435424805, 'acc': 0.65625, 'step': 477},\n",
       "  {'loss': 1.2318880558013916, 'acc': 0.5, 'step': 478},\n",
       "  {'loss': 1.383882761001587, 'acc': 0.5, 'step': 479},\n",
       "  {'loss': 1.3276807069778442, 'acc': 0.59375, 'step': 480},\n",
       "  {'loss': 1.1854615211486816, 'acc': 0.5625, 'step': 481},\n",
       "  {'loss': 1.267467737197876, 'acc': 0.625, 'step': 482},\n",
       "  {'loss': 1.3578139543533325, 'acc': 0.59375, 'step': 483},\n",
       "  {'loss': 1.2920327186584473, 'acc': 0.59375, 'step': 484},\n",
       "  {'loss': 1.3062775135040283, 'acc': 0.625, 'step': 485},\n",
       "  {'loss': 1.2009638547897339, 'acc': 0.625, 'step': 486},\n",
       "  {'loss': 1.0346554517745972, 'acc': 0.78125, 'step': 487},\n",
       "  {'loss': 1.2640188932418823, 'acc': 0.78125, 'step': 488},\n",
       "  {'loss': 1.166148066520691, 'acc': 0.71875, 'step': 489},\n",
       "  {'loss': 1.4859174489974976, 'acc': 0.5, 'step': 490},\n",
       "  {'loss': 1.324136734008789, 'acc': 0.5, 'step': 491},\n",
       "  {'loss': 1.1767812967300415, 'acc': 0.6875, 'step': 492},\n",
       "  {'loss': 1.3339943885803223, 'acc': 0.5625, 'step': 493},\n",
       "  {'loss': 1.343935489654541, 'acc': 0.59375, 'step': 494},\n",
       "  {'loss': 1.178450107574463, 'acc': 0.59375, 'step': 495},\n",
       "  {'loss': 1.0961002111434937, 'acc': 0.75, 'step': 496},\n",
       "  {'loss': 1.1926136016845703, 'acc': 0.53125, 'step': 497},\n",
       "  {'loss': 1.3804749250411987, 'acc': 0.46875, 'step': 498},\n",
       "  {'loss': 1.222241997718811, 'acc': 0.65625, 'step': 499},\n",
       "  {'loss': 1.2462284564971924, 'acc': 0.6875, 'step': 500},\n",
       "  {'loss': 1.1740306615829468, 'acc': 0.5625, 'step': 501},\n",
       "  {'loss': 1.08480966091156, 'acc': 0.53125, 'step': 502},\n",
       "  {'loss': 1.2886621952056885, 'acc': 0.46875, 'step': 503},\n",
       "  {'loss': 1.0746558904647827, 'acc': 0.75, 'step': 504},\n",
       "  {'loss': 1.235754370689392, 'acc': 0.5625, 'step': 505},\n",
       "  {'loss': 1.2323094606399536, 'acc': 0.5, 'step': 506},\n",
       "  {'loss': 1.3104910850524902, 'acc': 0.5, 'step': 507},\n",
       "  {'loss': 1.0504568815231323, 'acc': 0.71875, 'step': 508},\n",
       "  {'loss': 1.070654273033142, 'acc': 0.59375, 'step': 509},\n",
       "  {'loss': 1.2253395318984985, 'acc': 0.625, 'step': 510},\n",
       "  {'loss': 1.2247118949890137, 'acc': 0.46875, 'step': 511},\n",
       "  {'loss': 1.019029140472412, 'acc': 0.75, 'step': 512},\n",
       "  {'loss': 1.2068270444869995, 'acc': 0.5, 'step': 513},\n",
       "  {'loss': 1.1749192476272583, 'acc': 0.625, 'step': 514},\n",
       "  {'loss': 1.163570523262024, 'acc': 0.71875, 'step': 515},\n",
       "  {'loss': 1.0800645351409912, 'acc': 0.6875, 'step': 516},\n",
       "  {'loss': 1.2979495525360107, 'acc': 0.625, 'step': 517},\n",
       "  {'loss': 1.1272460222244263, 'acc': 0.71875, 'step': 518},\n",
       "  {'loss': 1.1777797937393188, 'acc': 0.59375, 'step': 519},\n",
       "  {'loss': 0.9662345051765442, 'acc': 0.78125, 'step': 520},\n",
       "  {'loss': 1.207417607307434, 'acc': 0.65625, 'step': 521},\n",
       "  {'loss': 1.3113877773284912, 'acc': 0.53125, 'step': 522},\n",
       "  {'loss': 1.1334874629974365, 'acc': 0.5625, 'step': 523},\n",
       "  {'loss': 1.029598355293274, 'acc': 0.65625, 'step': 524},\n",
       "  {'loss': 1.136951208114624, 'acc': 0.625, 'step': 525},\n",
       "  {'loss': 1.1389038562774658, 'acc': 0.71875, 'step': 526},\n",
       "  {'loss': 1.1215819120407104, 'acc': 0.75, 'step': 527},\n",
       "  {'loss': 1.1320858001708984, 'acc': 0.71875, 'step': 528},\n",
       "  {'loss': 1.122103214263916, 'acc': 0.59375, 'step': 529},\n",
       "  {'loss': 1.0907143354415894, 'acc': 0.6875, 'step': 530},\n",
       "  {'loss': 1.272752285003662, 'acc': 0.53125, 'step': 531},\n",
       "  {'loss': 1.2010561227798462, 'acc': 0.65625, 'step': 532},\n",
       "  {'loss': 1.1425491571426392, 'acc': 0.75, 'step': 533},\n",
       "  {'loss': 1.1746082305908203, 'acc': 0.5625, 'step': 534},\n",
       "  {'loss': 1.2322667837142944, 'acc': 0.5625, 'step': 535},\n",
       "  {'loss': 1.0422905683517456, 'acc': 0.78125, 'step': 536},\n",
       "  {'loss': 1.1137324571609497, 'acc': 0.71875, 'step': 537},\n",
       "  {'loss': 1.199327826499939, 'acc': 0.59375, 'step': 538},\n",
       "  {'loss': 1.200868010520935, 'acc': 0.59375, 'step': 539},\n",
       "  {'loss': 1.10720694065094, 'acc': 0.6875, 'step': 540},\n",
       "  {'loss': 1.079795002937317, 'acc': 0.5625, 'step': 541},\n",
       "  {'loss': 1.1550662517547607, 'acc': 0.625, 'step': 542},\n",
       "  {'loss': 0.9715718030929565, 'acc': 0.71875, 'step': 543},\n",
       "  {'loss': 1.163409948348999, 'acc': 0.5625, 'step': 544},\n",
       "  {'loss': 1.1178697347640991, 'acc': 0.6875, 'step': 545},\n",
       "  {'loss': 1.0673924684524536, 'acc': 0.625, 'step': 546},\n",
       "  {'loss': 1.2726248502731323, 'acc': 0.53125, 'step': 547},\n",
       "  {'loss': 0.9502629041671753, 'acc': 0.78125, 'step': 548},\n",
       "  {'loss': 1.1157746315002441, 'acc': 0.6875, 'step': 549},\n",
       "  {'loss': 1.1874536275863647, 'acc': 0.625, 'step': 550},\n",
       "  {'loss': 1.076156497001648, 'acc': 0.75, 'step': 551},\n",
       "  {'loss': 1.1854113340377808, 'acc': 0.625, 'step': 552},\n",
       "  {'loss': 1.1304699182510376, 'acc': 0.625, 'step': 553},\n",
       "  {'loss': 1.1357723474502563, 'acc': 0.625, 'step': 554},\n",
       "  {'loss': 0.9848939776420593, 'acc': 0.65625, 'step': 555},\n",
       "  {'loss': 0.951124906539917, 'acc': 0.8125, 'step': 556},\n",
       "  {'loss': 1.1060535907745361, 'acc': 0.65625, 'step': 557},\n",
       "  {'loss': 1.0834367275238037, 'acc': 0.75, 'step': 558},\n",
       "  {'loss': 1.2146259546279907, 'acc': 0.53125, 'step': 559},\n",
       "  {'loss': 0.9919092655181885, 'acc': 0.625, 'step': 560},\n",
       "  {'loss': 1.0879032611846924, 'acc': 0.71875, 'step': 561},\n",
       "  {'loss': 1.001721739768982, 'acc': 0.6875, 'step': 562},\n",
       "  {'loss': 0.9099011421203613, 'acc': 0.78125, 'step': 563},\n",
       "  {'loss': 1.1718016862869263, 'acc': 0.59375, 'step': 564},\n",
       "  {'loss': 0.9935044646263123, 'acc': 0.75, 'step': 565},\n",
       "  {'loss': 1.2336816787719727, 'acc': 0.5625, 'step': 566},\n",
       "  {'loss': 0.9868877530097961, 'acc': 0.65625, 'step': 567},\n",
       "  {'loss': 1.3072024583816528, 'acc': 0.625, 'step': 568},\n",
       "  {'loss': 1.0181310176849365, 'acc': 0.71875, 'step': 569},\n",
       "  {'loss': 1.1418410539627075, 'acc': 0.71875, 'step': 570},\n",
       "  {'loss': 1.2415460348129272, 'acc': 0.5, 'step': 571},\n",
       "  {'loss': 0.9954156279563904, 'acc': 0.625, 'step': 572},\n",
       "  {'loss': 1.0495398044586182, 'acc': 0.59375, 'step': 573},\n",
       "  {'loss': 1.0107115507125854, 'acc': 0.75, 'step': 574},\n",
       "  {'loss': 1.143539547920227, 'acc': 0.46875, 'step': 575},\n",
       "  {'loss': 1.1296244859695435, 'acc': 0.59375, 'step': 576},\n",
       "  {'loss': 1.1024538278579712, 'acc': 0.6875, 'step': 577},\n",
       "  {'loss': 0.9852343201637268, 'acc': 0.6875, 'step': 578},\n",
       "  {'loss': 0.9819602966308594, 'acc': 0.625, 'step': 579},\n",
       "  {'loss': 1.134404182434082, 'acc': 0.65625, 'step': 580},\n",
       "  {'loss': 1.0512323379516602, 'acc': 0.625, 'step': 581},\n",
       "  {'loss': 1.0155457258224487, 'acc': 0.75, 'step': 582},\n",
       "  {'loss': 1.1115912199020386, 'acc': 0.65625, 'step': 583},\n",
       "  {'loss': 1.0141295194625854, 'acc': 0.71875, 'step': 584},\n",
       "  {'loss': 1.0665291547775269, 'acc': 0.71875, 'step': 585},\n",
       "  {'loss': 0.9578420519828796, 'acc': 0.71875, 'step': 586},\n",
       "  {'loss': 1.0642235279083252, 'acc': 0.6875, 'step': 587},\n",
       "  {'loss': 1.051756501197815, 'acc': 0.65625, 'step': 588},\n",
       "  {'loss': 1.0006451606750488, 'acc': 0.65625, 'step': 589},\n",
       "  {'loss': 1.041835904121399, 'acc': 0.65625, 'step': 590},\n",
       "  {'loss': 1.1931086778640747, 'acc': 0.625, 'step': 591},\n",
       "  {'loss': 0.9402276277542114, 'acc': 0.78125, 'step': 592},\n",
       "  {'loss': 1.0646103620529175, 'acc': 0.625, 'step': 593},\n",
       "  {'loss': 1.3267009258270264, 'acc': 0.59375, 'step': 594},\n",
       "  {'loss': 1.0271461009979248, 'acc': 0.75, 'step': 595},\n",
       "  {'loss': 1.0858879089355469, 'acc': 0.65625, 'step': 596},\n",
       "  {'loss': 1.1163201332092285, 'acc': 0.65625, 'step': 597},\n",
       "  {'loss': 1.3654264211654663, 'acc': 0.5, 'step': 598},\n",
       "  {'loss': 1.0768921375274658, 'acc': 0.6875, 'step': 599},\n",
       "  {'loss': 1.0426292419433594, 'acc': 0.625, 'step': 600},\n",
       "  {'loss': 0.7966970205307007, 'acc': 0.6875, 'step': 601},\n",
       "  {'loss': 1.0811481475830078, 'acc': 0.65625, 'step': 602},\n",
       "  {'loss': 0.9240631461143494, 'acc': 0.8125, 'step': 603},\n",
       "  {'loss': 0.8974382877349854, 'acc': 0.71875, 'step': 604},\n",
       "  {'loss': 1.1788569688796997, 'acc': 0.5625, 'step': 605},\n",
       "  {'loss': 1.0003246068954468, 'acc': 0.5625, 'step': 606},\n",
       "  {'loss': 1.061769962310791, 'acc': 0.5625, 'step': 607},\n",
       "  {'loss': 0.9667077660560608, 'acc': 0.78125, 'step': 608},\n",
       "  {'loss': 1.0242141485214233, 'acc': 0.625, 'step': 609},\n",
       "  {'loss': 1.046665072441101, 'acc': 0.59375, 'step': 610},\n",
       "  {'loss': 1.06369948387146, 'acc': 0.5625, 'step': 611},\n",
       "  {'loss': 0.9822057485580444, 'acc': 0.65625, 'step': 612},\n",
       "  {'loss': 0.9518177509307861, 'acc': 0.625, 'step': 613},\n",
       "  {'loss': 1.0308856964111328, 'acc': 0.71875, 'step': 614},\n",
       "  {'loss': 1.1804211139678955, 'acc': 0.625, 'step': 615},\n",
       "  {'loss': 1.0415232181549072, 'acc': 0.65625, 'step': 616},\n",
       "  {'loss': 1.0071882009506226, 'acc': 0.5625, 'step': 617},\n",
       "  {'loss': 1.0716193914413452, 'acc': 0.5625, 'step': 618},\n",
       "  {'loss': 0.8488126397132874, 'acc': 0.84375, 'step': 619},\n",
       "  {'loss': 0.996423065662384, 'acc': 0.625, 'step': 620},\n",
       "  {'loss': 0.88844895362854, 'acc': 0.71875, 'step': 621},\n",
       "  {'loss': 0.7467432022094727, 'acc': 0.78125, 'step': 622},\n",
       "  {'loss': 1.2223091125488281, 'acc': 0.59375, 'step': 623},\n",
       "  {'loss': 1.4799058437347412, 'acc': 0.4375, 'step': 624},\n",
       "  {'loss': 0.7969645857810974, 'acc': 0.75, 'step': 625},\n",
       "  {'loss': 1.3826453685760498, 'acc': 0.40625, 'step': 626},\n",
       "  {'loss': 1.0060350894927979, 'acc': 0.78125, 'step': 627},\n",
       "  {'loss': 0.9774842262268066, 'acc': 0.5625, 'step': 628},\n",
       "  {'loss': 1.034891128540039, 'acc': 0.59375, 'step': 629},\n",
       "  {'loss': 0.9757668375968933, 'acc': 0.71875, 'step': 630},\n",
       "  {'loss': 1.045202612876892, 'acc': 0.53125, 'step': 631},\n",
       "  {'loss': 0.9629746079444885, 'acc': 0.65625, 'step': 632},\n",
       "  {'loss': 0.9116740822792053, 'acc': 0.625, 'step': 633},\n",
       "  {'loss': 0.9647268652915955, 'acc': 0.71875, 'step': 634},\n",
       "  {'loss': 0.9513678550720215, 'acc': 0.6875, 'step': 635},\n",
       "  {'loss': 1.1021244525909424, 'acc': 0.59375, 'step': 636},\n",
       "  {'loss': 1.1751646995544434, 'acc': 0.5625, 'step': 637},\n",
       "  {'loss': 0.7581372261047363, 'acc': 0.875, 'step': 638},\n",
       "  {'loss': 1.3047573566436768, 'acc': 0.5625, 'step': 639},\n",
       "  {'loss': 0.9278234243392944, 'acc': 0.71875, 'step': 640},\n",
       "  {'loss': 1.0503473281860352, 'acc': 0.59375, 'step': 641},\n",
       "  {'loss': 0.9808017611503601, 'acc': 0.625, 'step': 642},\n",
       "  {'loss': 0.9185320734977722, 'acc': 0.6875, 'step': 643},\n",
       "  {'loss': 1.034235954284668, 'acc': 0.6875, 'step': 644},\n",
       "  {'loss': 1.073857069015503, 'acc': 0.625, 'step': 645},\n",
       "  {'loss': 0.8801044225692749, 'acc': 0.71875, 'step': 646},\n",
       "  {'loss': 0.884246826171875, 'acc': 0.71875, 'step': 647},\n",
       "  {'loss': 1.1171602010726929, 'acc': 0.53125, 'step': 648},\n",
       "  {'loss': 1.1424057483673096, 'acc': 0.5625, 'step': 649},\n",
       "  {'loss': 1.0570043325424194, 'acc': 0.59375, 'step': 650},\n",
       "  {'loss': 1.0357941389083862, 'acc': 0.71875, 'step': 651},\n",
       "  {'loss': 1.1683878898620605, 'acc': 0.5, 'step': 652},\n",
       "  {'loss': 1.008665919303894, 'acc': 0.6875, 'step': 653},\n",
       "  {'loss': 0.8793749809265137, 'acc': 0.71875, 'step': 654},\n",
       "  {'loss': 0.8421767950057983, 'acc': 0.6875, 'step': 655},\n",
       "  {'loss': 0.970992922782898, 'acc': 0.65625, 'step': 656},\n",
       "  {'loss': 1.1827632188796997, 'acc': 0.5625, 'step': 657},\n",
       "  {'loss': 0.9767227172851562, 'acc': 0.625, 'step': 658},\n",
       "  {'loss': 0.9425739049911499, 'acc': 0.65625, 'step': 659},\n",
       "  {'loss': 1.134416103363037, 'acc': 0.625, 'step': 660},\n",
       "  {'loss': 0.8560088276863098, 'acc': 0.78125, 'step': 661},\n",
       "  {'loss': 1.2131133079528809, 'acc': 0.5625, 'step': 662},\n",
       "  {'loss': 1.025937795639038, 'acc': 0.625, 'step': 663},\n",
       "  {'loss': 0.9485080242156982, 'acc': 0.6875, 'step': 664},\n",
       "  {'loss': 1.0187112092971802, 'acc': 0.78125, 'step': 665},\n",
       "  {'loss': 0.9756812453269958, 'acc': 0.78125, 'step': 666},\n",
       "  {'loss': 1.1383068561553955, 'acc': 0.46875, 'step': 667},\n",
       "  {'loss': 0.9300122857093811, 'acc': 0.71875, 'step': 668},\n",
       "  {'loss': 1.0065102577209473, 'acc': 0.625, 'step': 669},\n",
       "  {'loss': 0.919687807559967, 'acc': 0.65625, 'step': 670},\n",
       "  {'loss': 0.845721960067749, 'acc': 0.75, 'step': 671},\n",
       "  {'loss': 1.2205586433410645, 'acc': 0.5625, 'step': 672},\n",
       "  {'loss': 1.0701496601104736, 'acc': 0.65625, 'step': 673},\n",
       "  {'loss': 1.0781015157699585, 'acc': 0.65625, 'step': 674},\n",
       "  {'loss': 0.8201987743377686, 'acc': 0.8125, 'step': 675},\n",
       "  {'loss': 1.0254021883010864, 'acc': 0.625, 'step': 676},\n",
       "  {'loss': 1.1684390306472778, 'acc': 0.625, 'step': 677},\n",
       "  {'loss': 0.9548280239105225, 'acc': 0.71875, 'step': 678},\n",
       "  {'loss': 0.8511960506439209, 'acc': 0.78125, 'step': 679},\n",
       "  {'loss': 0.9488399028778076, 'acc': 0.625, 'step': 680},\n",
       "  {'loss': 1.0598540306091309, 'acc': 0.5, 'step': 681},\n",
       "  {'loss': 1.0199207067489624, 'acc': 0.65625, 'step': 682},\n",
       "  {'loss': 0.8610701560974121, 'acc': 0.6875, 'step': 683},\n",
       "  {'loss': 0.8362316489219666, 'acc': 0.75, 'step': 684},\n",
       "  {'loss': 0.7854495048522949, 'acc': 0.71875, 'step': 685},\n",
       "  {'loss': 1.052103877067566, 'acc': 0.625, 'step': 686},\n",
       "  {'loss': 1.231866717338562, 'acc': 0.6875, 'step': 687},\n",
       "  {'loss': 1.1389145851135254, 'acc': 0.65625, 'step': 688},\n",
       "  {'loss': 0.8742784857749939, 'acc': 0.65625, 'step': 689},\n",
       "  {'loss': 1.0185678005218506, 'acc': 0.65625, 'step': 690},\n",
       "  {'loss': 0.9151673316955566, 'acc': 0.625, 'step': 691},\n",
       "  {'loss': 0.8290215730667114, 'acc': 0.78125, 'step': 692},\n",
       "  {'loss': 0.6971431970596313, 'acc': 0.84375, 'step': 693},\n",
       "  {'loss': 1.2243282794952393, 'acc': 0.46875, 'step': 694},\n",
       "  {'loss': 0.9638843536376953, 'acc': 0.6875, 'step': 695},\n",
       "  {'loss': 0.8770726323127747, 'acc': 0.78125, 'step': 696},\n",
       "  {'loss': 1.1349917650222778, 'acc': 0.59375, 'step': 697},\n",
       "  {'loss': 0.784997284412384, 'acc': 0.71875, 'step': 698},\n",
       "  {'loss': 0.9258673191070557, 'acc': 0.6875, 'step': 699},\n",
       "  {'loss': 0.8595068454742432, 'acc': 0.71875, 'step': 700},\n",
       "  {'loss': 1.0227272510528564, 'acc': 0.65625, 'step': 701},\n",
       "  {'loss': 0.8220561146736145, 'acc': 0.65625, 'step': 702},\n",
       "  {'loss': 1.084648847579956, 'acc': 0.59375, 'step': 703},\n",
       "  {'loss': 1.0974074602127075, 'acc': 0.53125, 'step': 704},\n",
       "  {'loss': 0.8727545142173767, 'acc': 0.625, 'step': 705},\n",
       "  {'loss': 1.0850011110305786, 'acc': 0.625, 'step': 706},\n",
       "  {'loss': 0.9677842855453491, 'acc': 0.5625, 'step': 707},\n",
       "  {'loss': 0.9076614379882812, 'acc': 0.6875, 'step': 708},\n",
       "  {'loss': 1.011164665222168, 'acc': 0.53125, 'step': 709},\n",
       "  {'loss': 1.2105554342269897, 'acc': 0.625, 'step': 710},\n",
       "  {'loss': 0.9415411353111267, 'acc': 0.65625, 'step': 711},\n",
       "  {'loss': 1.069749116897583, 'acc': 0.59375, 'step': 712},\n",
       "  {'loss': 0.8768381476402283, 'acc': 0.65625, 'step': 713},\n",
       "  {'loss': 1.1023645401000977, 'acc': 0.65625, 'step': 714},\n",
       "  {'loss': 1.0020703077316284, 'acc': 0.6875, 'step': 715},\n",
       "  {'loss': 0.8978596329689026, 'acc': 0.71875, 'step': 716},\n",
       "  {'loss': 0.8921952843666077, 'acc': 0.6875, 'step': 717},\n",
       "  {'loss': 1.0937899351119995, 'acc': 0.5625, 'step': 718},\n",
       "  {'loss': 1.031160831451416, 'acc': 0.5625, 'step': 719},\n",
       "  {'loss': 1.1125644445419312, 'acc': 0.53125, 'step': 720},\n",
       "  {'loss': 1.0612006187438965, 'acc': 0.625, 'step': 721},\n",
       "  {'loss': 1.0747088193893433, 'acc': 0.53125, 'step': 722},\n",
       "  {'loss': 1.056857705116272, 'acc': 0.53125, 'step': 723},\n",
       "  {'loss': 0.8486437797546387, 'acc': 0.625, 'step': 724},\n",
       "  {'loss': 0.9487929940223694, 'acc': 0.65625, 'step': 725},\n",
       "  {'loss': 0.9619579315185547, 'acc': 0.65625, 'step': 726},\n",
       "  {'loss': 1.1104644536972046, 'acc': 0.6875, 'step': 727},\n",
       "  {'loss': 0.9740316271781921, 'acc': 0.625, 'step': 728},\n",
       "  {'loss': 0.8911973237991333, 'acc': 0.65625, 'step': 729},\n",
       "  {'loss': 1.0379685163497925, 'acc': 0.59375, 'step': 730},\n",
       "  {'loss': 0.8486558198928833, 'acc': 0.75, 'step': 731},\n",
       "  {'loss': 1.1078075170516968, 'acc': 0.65625, 'step': 732},\n",
       "  {'loss': 0.9908788800239563, 'acc': 0.6875, 'step': 733},\n",
       "  {'loss': 1.0178556442260742, 'acc': 0.5625, 'step': 734},\n",
       "  {'loss': 1.2939571142196655, 'acc': 0.59375, 'step': 735},\n",
       "  {'loss': 0.879264771938324, 'acc': 0.6875, 'step': 736},\n",
       "  {'loss': 1.055385947227478, 'acc': 0.625, 'step': 737},\n",
       "  {'loss': 0.8839831352233887, 'acc': 0.78125, 'step': 738},\n",
       "  {'loss': 0.899480938911438, 'acc': 0.65625, 'step': 739},\n",
       "  {'loss': 0.9147461652755737, 'acc': 0.75, 'step': 740},\n",
       "  {'loss': 0.9013363122940063, 'acc': 0.6875, 'step': 741},\n",
       "  {'loss': 1.096781611442566, 'acc': 0.6875, 'step': 742},\n",
       "  {'loss': 0.7847893834114075, 'acc': 0.84375, 'step': 743},\n",
       "  {'loss': 0.8554180264472961, 'acc': 0.71875, 'step': 744},\n",
       "  {'loss': 0.8882409930229187, 'acc': 0.71875, 'step': 745},\n",
       "  {'loss': 0.8326713442802429, 'acc': 0.65625, 'step': 746},\n",
       "  {'loss': 1.0067261457443237, 'acc': 0.59375, 'step': 747},\n",
       "  {'loss': 1.014891266822815, 'acc': 0.71875, 'step': 748},\n",
       "  {'loss': 0.8626000285148621, 'acc': 0.71875, 'step': 749},\n",
       "  {'loss': 0.7941645383834839, 'acc': 0.65625, 'step': 750},\n",
       "  {'loss': 0.7891246676445007, 'acc': 0.71875, 'step': 751},\n",
       "  {'loss': 0.9096909761428833, 'acc': 0.71875, 'step': 752},\n",
       "  {'loss': 0.9393530488014221, 'acc': 0.75, 'step': 753},\n",
       "  {'loss': 0.9365777373313904, 'acc': 0.65625, 'step': 754},\n",
       "  {'loss': 0.8609322309494019, 'acc': 0.71875, 'step': 755},\n",
       "  {'loss': 0.9306965470314026, 'acc': 0.75, 'step': 756},\n",
       "  {'loss': 0.9869763851165771, 'acc': 0.65625, 'step': 757},\n",
       "  {'loss': 1.025873064994812, 'acc': 0.53125, 'step': 758},\n",
       "  {'loss': 1.1695666313171387, 'acc': 0.71875, 'step': 759},\n",
       "  {'loss': 0.8302895426750183, 'acc': 0.6875, 'step': 760},\n",
       "  {'loss': 0.9459061622619629, 'acc': 0.65625, 'step': 761},\n",
       "  {'loss': 0.8869794011116028, 'acc': 0.71875, 'step': 762},\n",
       "  {'loss': 1.1553876399993896, 'acc': 0.53125, 'step': 763},\n",
       "  {'loss': 0.7485399842262268, 'acc': 0.78125, 'step': 764},\n",
       "  {'loss': 0.8199816346168518, 'acc': 0.71875, 'step': 765},\n",
       "  {'loss': 1.1156266927719116, 'acc': 0.5625, 'step': 766},\n",
       "  {'loss': 0.9493651390075684, 'acc': 0.625, 'step': 767},\n",
       "  {'loss': 0.9353766441345215, 'acc': 0.625, 'step': 768},\n",
       "  {'loss': 0.8289494514465332, 'acc': 0.625, 'step': 769},\n",
       "  {'loss': 0.8207612037658691, 'acc': 0.75, 'step': 770},\n",
       "  {'loss': 0.7894371747970581, 'acc': 0.625, 'step': 771},\n",
       "  {'loss': 0.7780588269233704, 'acc': 0.65625, 'step': 772},\n",
       "  {'loss': 0.8553495407104492, 'acc': 0.65625, 'step': 773},\n",
       "  {'loss': 0.7092578411102295, 'acc': 0.90625, 'step': 774},\n",
       "  {'loss': 0.9157316088676453, 'acc': 0.71875, 'step': 775},\n",
       "  {'loss': 0.8963596224784851, 'acc': 0.65625, 'step': 776},\n",
       "  {'loss': 0.8068850636482239, 'acc': 0.78125, 'step': 777},\n",
       "  {'loss': 0.8081820011138916, 'acc': 0.75, 'step': 778},\n",
       "  {'loss': 0.7842320203781128, 'acc': 0.6875, 'step': 779},\n",
       "  {'loss': 1.0127341747283936, 'acc': 0.59375, 'step': 780},\n",
       "  {'loss': 1.084052324295044, 'acc': 0.46875, 'step': 781},\n",
       "  {'loss': 1.1157760620117188, 'acc': 0.53125, 'step': 782},\n",
       "  {'loss': 1.0381615161895752, 'acc': 0.5625, 'step': 783},\n",
       "  {'loss': 1.0775128602981567, 'acc': 0.625, 'step': 784},\n",
       "  {'loss': 0.80357426404953, 'acc': 0.75, 'step': 785},\n",
       "  {'loss': 0.8228570818901062, 'acc': 0.6875, 'step': 786},\n",
       "  {'loss': 0.6886504292488098, 'acc': 0.65625, 'step': 787},\n",
       "  {'loss': 0.8079223036766052, 'acc': 0.6875, 'step': 788},\n",
       "  {'loss': 0.7239783406257629, 'acc': 0.71875, 'step': 789},\n",
       "  {'loss': 0.7104116678237915, 'acc': 0.84375, 'step': 790},\n",
       "  {'loss': 1.082758903503418, 'acc': 0.5, 'step': 791},\n",
       "  {'loss': 0.7602406144142151, 'acc': 0.71875, 'step': 792},\n",
       "  {'loss': 0.9035868644714355, 'acc': 0.71875, 'step': 793},\n",
       "  {'loss': 1.2208503484725952, 'acc': 0.40625, 'step': 794},\n",
       "  {'loss': 1.1916288137435913, 'acc': 0.59375, 'step': 795},\n",
       "  {'loss': 0.8849146366119385, 'acc': 0.71875, 'step': 796},\n",
       "  {'loss': 1.0685582160949707, 'acc': 0.625, 'step': 797},\n",
       "  {'loss': 0.8325724005699158, 'acc': 0.78125, 'step': 798},\n",
       "  {'loss': 0.9177409410476685, 'acc': 0.6875, 'step': 799},\n",
       "  {'loss': 0.9840621948242188, 'acc': 0.59375, 'step': 800},\n",
       "  {'loss': 0.8174271583557129, 'acc': 0.78125, 'step': 801},\n",
       "  {'loss': 1.2202366590499878, 'acc': 0.53125, 'step': 802},\n",
       "  {'loss': 0.825385570526123, 'acc': 0.625, 'step': 803},\n",
       "  {'loss': 0.9454753398895264, 'acc': 0.625, 'step': 804},\n",
       "  {'loss': 0.8766263127326965, 'acc': 0.6875, 'step': 805},\n",
       "  {'loss': 0.8688812255859375, 'acc': 0.65625, 'step': 806},\n",
       "  {'loss': 0.7667515277862549, 'acc': 0.71875, 'step': 807},\n",
       "  {'loss': 0.8056125044822693, 'acc': 0.6875, 'step': 808},\n",
       "  {'loss': 0.8199455738067627, 'acc': 0.6875, 'step': 809},\n",
       "  {'loss': 1.0232714414596558, 'acc': 0.53125, 'step': 810},\n",
       "  {'loss': 1.1682262420654297, 'acc': 0.59375, 'step': 811},\n",
       "  {'loss': 1.0742263793945312, 'acc': 0.65625, 'step': 812},\n",
       "  {'loss': 0.9230796098709106, 'acc': 0.71875, 'step': 813},\n",
       "  {'loss': 0.9536821246147156, 'acc': 0.625, 'step': 814},\n",
       "  {'loss': 0.8745673298835754, 'acc': 0.625, 'step': 815},\n",
       "  {'loss': 1.1020504236221313, 'acc': 0.53125, 'step': 816},\n",
       "  {'loss': 0.8154348731040955, 'acc': 0.71875, 'step': 817},\n",
       "  {'loss': 0.9181380867958069, 'acc': 0.53125, 'step': 818},\n",
       "  {'loss': 0.919864296913147, 'acc': 0.625, 'step': 819},\n",
       "  {'loss': 0.7520703673362732, 'acc': 0.71875, 'step': 820},\n",
       "  {'loss': 0.8011375069618225, 'acc': 0.78125, 'step': 821},\n",
       "  {'loss': 0.7763778567314148, 'acc': 0.78125, 'step': 822},\n",
       "  {'loss': 0.8052903413772583, 'acc': 0.65625, 'step': 823},\n",
       "  {'loss': 0.8610344529151917, 'acc': 0.65625, 'step': 824},\n",
       "  {'loss': 0.9223821759223938, 'acc': 0.625, 'step': 825},\n",
       "  {'loss': 0.8893699645996094, 'acc': 0.65625, 'step': 826},\n",
       "  {'loss': 0.8378844261169434, 'acc': 0.6875, 'step': 827},\n",
       "  {'loss': 0.8474524021148682, 'acc': 0.71875, 'step': 828},\n",
       "  {'loss': 0.853630542755127, 'acc': 0.6875, 'step': 829},\n",
       "  {'loss': 0.9343487620353699, 'acc': 0.625, 'step': 830},\n",
       "  {'loss': 0.8892411589622498, 'acc': 0.65625, 'step': 831},\n",
       "  {'loss': 0.9958215355873108, 'acc': 0.625, 'step': 832},\n",
       "  {'loss': 1.0345455408096313, 'acc': 0.65625, 'step': 833},\n",
       "  {'loss': 0.9019474387168884, 'acc': 0.65625, 'step': 834},\n",
       "  {'loss': 1.0115959644317627, 'acc': 0.59375, 'step': 835},\n",
       "  {'loss': 0.7597535252571106, 'acc': 0.75, 'step': 836},\n",
       "  {'loss': 0.8773844242095947, 'acc': 0.75, 'step': 837},\n",
       "  {'loss': 1.0583336353302002, 'acc': 0.59375, 'step': 838},\n",
       "  {'loss': 1.1897259950637817, 'acc': 0.65625, 'step': 839},\n",
       "  {'loss': 1.1460721492767334, 'acc': 0.65625, 'step': 840},\n",
       "  {'loss': 0.9099715352058411, 'acc': 0.6875, 'step': 841},\n",
       "  {'loss': 1.1607223749160767, 'acc': 0.53125, 'step': 842},\n",
       "  {'loss': 0.6545708775520325, 'acc': 0.75, 'step': 843},\n",
       "  {'loss': 0.8661980628967285, 'acc': 0.71875, 'step': 844},\n",
       "  {'loss': 0.9247742891311646, 'acc': 0.75, 'step': 845},\n",
       "  {'loss': 0.9204138517379761, 'acc': 0.59375, 'step': 846},\n",
       "  {'loss': 0.9907577037811279, 'acc': 0.5625, 'step': 847},\n",
       "  {'loss': 1.0036228895187378, 'acc': 0.5625, 'step': 848},\n",
       "  {'loss': 0.8599851727485657, 'acc': 0.65625, 'step': 849},\n",
       "  {'loss': 0.8935459852218628, 'acc': 0.6875, 'step': 850},\n",
       "  {'loss': 0.9636085033416748, 'acc': 0.65625, 'step': 851},\n",
       "  {'loss': 1.024898886680603, 'acc': 0.5625, 'step': 852},\n",
       "  {'loss': 0.7890684604644775, 'acc': 0.78125, 'step': 853},\n",
       "  {'loss': 0.7937761545181274, 'acc': 0.75, 'step': 854},\n",
       "  {'loss': 0.9396832585334778, 'acc': 0.65625, 'step': 855},\n",
       "  {'loss': 0.9281766414642334, 'acc': 0.5625, 'step': 856},\n",
       "  {'loss': 0.7413584589958191, 'acc': 0.78125, 'step': 857},\n",
       "  {'loss': 1.0108438730239868, 'acc': 0.6875, 'step': 858},\n",
       "  {'loss': 0.7924935221672058, 'acc': 0.65625, 'step': 859},\n",
       "  {'loss': 0.7638298273086548, 'acc': 0.71875, 'step': 860},\n",
       "  {'loss': 0.7542847990989685, 'acc': 0.84375, 'step': 861},\n",
       "  {'loss': 0.8445537686347961, 'acc': 0.71875, 'step': 862},\n",
       "  {'loss': 0.9515883922576904, 'acc': 0.625, 'step': 863},\n",
       "  {'loss': 0.8612182140350342, 'acc': 0.6875, 'step': 864},\n",
       "  {'loss': 0.7994034290313721, 'acc': 0.75, 'step': 865},\n",
       "  {'loss': 0.6643679141998291, 'acc': 0.78125, 'step': 866},\n",
       "  {'loss': 0.6870971322059631, 'acc': 0.75, 'step': 867},\n",
       "  {'loss': 0.9347882270812988, 'acc': 0.6875, 'step': 868},\n",
       "  {'loss': 1.040454387664795, 'acc': 0.59375, 'step': 869},\n",
       "  {'loss': 0.8476191759109497, 'acc': 0.6875, 'step': 870},\n",
       "  {'loss': 1.17768132686615, 'acc': 0.59375, 'step': 871},\n",
       "  {'loss': 0.9973228573799133, 'acc': 0.59375, 'step': 872},\n",
       "  {'loss': 0.8823473453521729, 'acc': 0.65625, 'step': 873},\n",
       "  {'loss': 1.019063115119934, 'acc': 0.6875, 'step': 874},\n",
       "  {'loss': 0.7849819660186768, 'acc': 0.6875, 'step': 875},\n",
       "  {'loss': 0.6756395697593689, 'acc': 0.71875, 'step': 876},\n",
       "  {'loss': 0.8334730863571167, 'acc': 0.6875, 'step': 877},\n",
       "  {'loss': 0.7853495478630066, 'acc': 0.75, 'step': 878},\n",
       "  {'loss': 0.7752290368080139, 'acc': 0.75, 'step': 879},\n",
       "  {'loss': 0.8695573210716248, 'acc': 0.71875, 'step': 880},\n",
       "  {'loss': 0.9235719442367554, 'acc': 0.5625, 'step': 881},\n",
       "  {'loss': 0.7689850330352783, 'acc': 0.6875, 'step': 882},\n",
       "  {'loss': 0.9661237001419067, 'acc': 0.59375, 'step': 883},\n",
       "  {'loss': 0.729693591594696, 'acc': 0.71875, 'step': 884},\n",
       "  {'loss': 0.753454864025116, 'acc': 0.75, 'step': 885},\n",
       "  {'loss': 0.563541829586029, 'acc': 0.90625, 'step': 886},\n",
       "  {'loss': 0.75303053855896, 'acc': 0.6875, 'step': 887},\n",
       "  {'loss': 0.8201056122779846, 'acc': 0.59375, 'step': 888},\n",
       "  {'loss': 0.6893051266670227, 'acc': 0.8125, 'step': 889},\n",
       "  {'loss': 0.7733055949211121, 'acc': 0.75, 'step': 890},\n",
       "  {'loss': 0.8723658323287964, 'acc': 0.65625, 'step': 891},\n",
       "  {'loss': 0.9031251668930054, 'acc': 0.65625, 'step': 892},\n",
       "  {'loss': 0.8177598118782043, 'acc': 0.65625, 'step': 893},\n",
       "  {'loss': 0.7679427266120911, 'acc': 0.75, 'step': 894},\n",
       "  {'loss': 0.8199578523635864, 'acc': 0.71875, 'step': 895},\n",
       "  {'loss': 0.7602415680885315, 'acc': 0.75, 'step': 896},\n",
       "  {'loss': 0.6857321858406067, 'acc': 0.71875, 'step': 897},\n",
       "  {'loss': 0.8462696671485901, 'acc': 0.78125, 'step': 898},\n",
       "  {'loss': 0.8862324357032776, 'acc': 0.78125, 'step': 899},\n",
       "  {'loss': 0.7828022241592407, 'acc': 0.71875, 'step': 900},\n",
       "  {'loss': 0.8641189932823181, 'acc': 0.65625, 'step': 901},\n",
       "  {'loss': 0.9048851132392883, 'acc': 0.6875, 'step': 902},\n",
       "  {'loss': 0.7719627022743225, 'acc': 0.75, 'step': 903},\n",
       "  {'loss': 1.1132359504699707, 'acc': 0.59375, 'step': 904},\n",
       "  {'loss': 0.9002773761749268, 'acc': 0.6875, 'step': 905},\n",
       "  {'loss': 0.8226812481880188, 'acc': 0.71875, 'step': 906},\n",
       "  {'loss': 0.8714103102684021, 'acc': 0.65625, 'step': 907},\n",
       "  {'loss': 0.7786287665367126, 'acc': 0.71875, 'step': 908},\n",
       "  {'loss': 0.8556115031242371, 'acc': 0.71875, 'step': 909},\n",
       "  {'loss': 0.7780686020851135, 'acc': 0.78125, 'step': 910},\n",
       "  {'loss': 0.8997495770454407, 'acc': 0.5625, 'step': 911},\n",
       "  {'loss': 0.9075233936309814, 'acc': 0.65625, 'step': 912},\n",
       "  {'loss': 0.8747426271438599, 'acc': 0.6875, 'step': 913},\n",
       "  {'loss': 1.07351553440094, 'acc': 0.6875, 'step': 914},\n",
       "  {'loss': 0.876203179359436, 'acc': 0.65625, 'step': 915},\n",
       "  {'loss': 1.0085175037384033, 'acc': 0.6875, 'step': 916},\n",
       "  {'loss': 0.853233814239502, 'acc': 0.71875, 'step': 917},\n",
       "  {'loss': 1.0605090856552124, 'acc': 0.59375, 'step': 918},\n",
       "  {'loss': 1.0661722421646118, 'acc': 0.5625, 'step': 919},\n",
       "  {'loss': 0.703640878200531, 'acc': 0.75, 'step': 920},\n",
       "  {'loss': 0.6823269128799438, 'acc': 0.84375, 'step': 921},\n",
       "  {'loss': 0.9301414489746094, 'acc': 0.75, 'step': 922},\n",
       "  {'loss': 0.9110345840454102, 'acc': 0.65625, 'step': 923},\n",
       "  {'loss': 1.0665969848632812, 'acc': 0.71875, 'step': 924},\n",
       "  {'loss': 0.5628857612609863, 'acc': 0.75, 'step': 925},\n",
       "  {'loss': 1.0377137660980225, 'acc': 0.8125, 'step': 926},\n",
       "  {'loss': 0.7837437987327576, 'acc': 0.8125, 'step': 927},\n",
       "  {'loss': 0.7284223437309265, 'acc': 0.75, 'step': 928},\n",
       "  {'loss': 0.912277102470398, 'acc': 0.71875, 'step': 929},\n",
       "  {'loss': 0.9787271618843079, 'acc': 0.78125, 'step': 930},\n",
       "  {'loss': 0.7770315408706665, 'acc': 0.65625, 'step': 931},\n",
       "  {'loss': 0.7988988161087036, 'acc': 0.75, 'step': 932},\n",
       "  {'loss': 0.9293509125709534, 'acc': 0.71875, 'step': 933},\n",
       "  {'loss': 0.8046624064445496, 'acc': 0.75, 'step': 934},\n",
       "  {'loss': 0.8602752685546875, 'acc': 0.59375, 'step': 935},\n",
       "  {'loss': 0.7732338905334473, 'acc': 0.8125, 'step': 936},\n",
       "  {'loss': 0.8245550990104675, 'acc': 0.71875, 'step': 937},\n",
       "  {'loss': 0.76173335313797, 'acc': 0.75, 'step': 938},\n",
       "  {'loss': 1.0158381462097168, 'acc': 0.59375, 'step': 939},\n",
       "  {'loss': 0.8777947425842285, 'acc': 0.65625, 'step': 940},\n",
       "  {'loss': 0.8323215842247009, 'acc': 0.625, 'step': 941},\n",
       "  {'loss': 0.9788565635681152, 'acc': 0.75, 'step': 942},\n",
       "  {'loss': 0.8853160738945007, 'acc': 0.6875, 'step': 943},\n",
       "  {'loss': 1.0500664710998535, 'acc': 0.5625, 'step': 944},\n",
       "  {'loss': 0.7628072500228882, 'acc': 0.84375, 'step': 945},\n",
       "  {'loss': 1.0454206466674805, 'acc': 0.53125, 'step': 946},\n",
       "  {'loss': 0.9422480463981628, 'acc': 0.65625, 'step': 947},\n",
       "  {'loss': 0.9827288389205933, 'acc': 0.53125, 'step': 948},\n",
       "  {'loss': 0.8483107089996338, 'acc': 0.75, 'step': 949},\n",
       "  {'loss': 0.6386427879333496, 'acc': 0.78125, 'step': 950},\n",
       "  {'loss': 0.6226001977920532, 'acc': 0.875, 'step': 951},\n",
       "  {'loss': 0.8947317004203796, 'acc': 0.78125, 'step': 952},\n",
       "  {'loss': 0.9376909136772156, 'acc': 0.65625, 'step': 953},\n",
       "  {'loss': 0.8514317274093628, 'acc': 0.75, 'step': 954},\n",
       "  {'loss': 0.6644408702850342, 'acc': 0.75, 'step': 955},\n",
       "  {'loss': 0.7659342288970947, 'acc': 0.625, 'step': 956},\n",
       "  {'loss': 0.6209215521812439, 'acc': 0.8125, 'step': 957},\n",
       "  {'loss': 0.9398308396339417, 'acc': 0.59375, 'step': 958},\n",
       "  {'loss': 0.9815256595611572, 'acc': 0.46875, 'step': 959},\n",
       "  {'loss': 0.6557210087776184, 'acc': 0.8125, 'step': 960},\n",
       "  {'loss': 0.96428382396698, 'acc': 0.625, 'step': 961},\n",
       "  {'loss': 0.9054787158966064, 'acc': 0.625, 'step': 962},\n",
       "  {'loss': 0.9564090967178345, 'acc': 0.65625, 'step': 963},\n",
       "  {'loss': 0.79926997423172, 'acc': 0.78125, 'step': 964},\n",
       "  {'loss': 0.8619529604911804, 'acc': 0.65625, 'step': 965},\n",
       "  {'loss': 1.0370811223983765, 'acc': 0.65625, 'step': 966},\n",
       "  {'loss': 0.8335065245628357, 'acc': 0.59375, 'step': 967},\n",
       "  {'loss': 0.7347031831741333, 'acc': 0.71875, 'step': 968},\n",
       "  {'loss': 0.8429235816001892, 'acc': 0.65625, 'step': 969},\n",
       "  {'loss': 0.8809478878974915, 'acc': 0.59375, 'step': 970},\n",
       "  {'loss': 1.0498303174972534, 'acc': 0.6875, 'step': 971},\n",
       "  {'loss': 0.9462661147117615, 'acc': 0.5, 'step': 972},\n",
       "  {'loss': 0.7088887691497803, 'acc': 0.6875, 'step': 973},\n",
       "  {'loss': 0.7489612698554993, 'acc': 0.6875, 'step': 974},\n",
       "  {'loss': 0.9704667329788208, 'acc': 0.71875, 'step': 975},\n",
       "  {'loss': 0.7222259044647217, 'acc': 0.71875, 'step': 976},\n",
       "  {'loss': 0.9318848252296448, 'acc': 0.65625, 'step': 977},\n",
       "  {'loss': 0.9219111800193787, 'acc': 0.65625, 'step': 978},\n",
       "  {'loss': 0.8458349704742432, 'acc': 0.625, 'step': 979},\n",
       "  {'loss': 0.8209511637687683, 'acc': 0.6875, 'step': 980},\n",
       "  {'loss': 0.7030048370361328, 'acc': 0.71875, 'step': 981},\n",
       "  {'loss': 1.027543544769287, 'acc': 0.71875, 'step': 982},\n",
       "  {'loss': 0.9524096846580505, 'acc': 0.53125, 'step': 983},\n",
       "  {'loss': 0.8062534332275391, 'acc': 0.6875, 'step': 984},\n",
       "  {'loss': 0.8847635388374329, 'acc': 0.59375, 'step': 985},\n",
       "  {'loss': 0.8052626848220825, 'acc': 0.71875, 'step': 986},\n",
       "  {'loss': 0.6965398192405701, 'acc': 0.71875, 'step': 987},\n",
       "  {'loss': 0.8448284864425659, 'acc': 0.71875, 'step': 988},\n",
       "  {'loss': 0.7957868576049805, 'acc': 0.65625, 'step': 989},\n",
       "  {'loss': 0.7405821084976196, 'acc': 0.75, 'step': 990},\n",
       "  {'loss': 0.8508751392364502, 'acc': 0.625, 'step': 991},\n",
       "  {'loss': 1.022251844406128, 'acc': 0.65625, 'step': 992},\n",
       "  {'loss': 1.0599838495254517, 'acc': 0.53125, 'step': 993},\n",
       "  {'loss': 0.9776920676231384, 'acc': 0.59375, 'step': 994},\n",
       "  {'loss': 0.6135526299476624, 'acc': 0.84375, 'step': 995},\n",
       "  {'loss': 0.8629176020622253, 'acc': 0.6875, 'step': 996},\n",
       "  {'loss': 0.9364793300628662, 'acc': 0.5625, 'step': 997},\n",
       "  {'loss': 0.8190671801567078, 'acc': 0.6875, 'step': 998},\n",
       "  {'loss': 0.7346789836883545, 'acc': 0.71875, 'step': 999},\n",
       "  ...],\n",
       " 'val': [{'loss': 2.2944640494028725, 'acc': 0.10623333333333333, 'step': 0},\n",
       "  {'loss': 0.8195127632459005, 'acc': 0.7124333333333334, 'step': 1000},\n",
       "  {'loss': 0.6318516727685929, 'acc': 0.78235, 'step': 2000},\n",
       "  {'loss': 0.5692845871130625, 'acc': 0.7983333333333333, 'step': 3000},\n",
       "  {'loss': 0.524923327366511, 'acc': 0.82015, 'step': 4000},\n",
       "  {'loss': 0.4863818513035774, 'acc': 0.8278, 'step': 5000},\n",
       "  {'loss': 0.45842994330326714, 'acc': 0.8397666666666667, 'step': 6000},\n",
       "  {'loss': 0.4485795553803444, 'acc': 0.8418666666666667, 'step': 7000},\n",
       "  {'loss': 0.4309105487863223, 'acc': 0.8496666666666667, 'step': 8000},\n",
       "  {'loss': 0.4219120741883914, 'acc': 0.8522833333333333, 'step': 9000},\n",
       "  {'loss': 0.41192964662710824, 'acc': 0.8571166666666666, 'step': 10000},\n",
       "  {'loss': 0.41326586027145384, 'acc': 0.8534333333333334, 'step': 11000},\n",
       "  {'loss': 0.394993842792511, 'acc': 0.8617, 'step': 12000},\n",
       "  {'loss': 0.39479088960886, 'acc': 0.8627, 'step': 13000},\n",
       "  {'loss': 0.3819419189294179, 'acc': 0.86685, 'step': 14000},\n",
       "  {'loss': 0.37579365457693736, 'acc': 0.8671833333333333, 'step': 15000},\n",
       "  {'loss': 0.3963055289387703, 'acc': 0.8578666666666667, 'step': 16000},\n",
       "  {'loss': 0.36906179766853653, 'acc': 0.86995, 'step': 17000},\n",
       "  {'loss': 0.3572906277775764, 'acc': 0.8741833333333333, 'step': 18000},\n",
       "  {'loss': 0.3548353797276815, 'acc': 0.87525, 'step': 19000},\n",
       "  {'loss': 0.3642833863993486, 'acc': 0.8718666666666667, 'step': 20000},\n",
       "  {'loss': 0.3551409074187279, 'acc': 0.8737833333333334, 'step': 21000},\n",
       "  {'loss': 0.34563105181852977, 'acc': 0.87705, 'step': 22000},\n",
       "  {'loss': 0.34471311839024227, 'acc': 0.8775833333333334, 'step': 23000},\n",
       "  {'loss': 0.34206346681316696, 'acc': 0.8782666666666666, 'step': 24000},\n",
       "  {'loss': 0.33462838250796, 'acc': 0.8808, 'step': 25000},\n",
       "  {'loss': 0.32862622451583545, 'acc': 0.88315, 'step': 26000},\n",
       "  {'loss': 0.32282853507200876, 'acc': 0.8845, 'step': 27000},\n",
       "  {'loss': 0.33888376590808234, 'acc': 0.8798833333333334, 'step': 28000},\n",
       "  {'loss': 0.3123558778007825, 'acc': 0.8885666666666666, 'step': 29000},\n",
       "  {'loss': 0.3089906776467959, 'acc': 0.8885, 'step': 30000},\n",
       "  {'loss': 0.31682980855107307, 'acc': 0.8854833333333333, 'step': 31000},\n",
       "  {'loss': 0.30828298759063083, 'acc': 0.8887, 'step': 32000},\n",
       "  {'loss': 0.30669257099032404, 'acc': 0.8905333333333333, 'step': 33000},\n",
       "  {'loss': 0.30555555178523064, 'acc': 0.8902833333333333, 'step': 34000},\n",
       "  {'loss': 0.29143879696329433, 'acc': 0.89515, 'step': 35000},\n",
       "  {'loss': 0.28865779698292415, 'acc': 0.8960333333333333, 'step': 36000},\n",
       "  {'loss': 0.2904567256251971, 'acc': 0.8959333333333334, 'step': 37000},\n",
       "  {'loss': 0.28821218098600704, 'acc': 0.8961166666666667, 'step': 38000},\n",
       "  {'loss': 0.2826797500749429, 'acc': 0.89965, 'step': 39000},\n",
       "  {'loss': 0.277932781602939, 'acc': 0.9004, 'step': 40000},\n",
       "  {'loss': 0.27512894894480705, 'acc': 0.90135, 'step': 41000},\n",
       "  {'loss': 0.2733636199235916, 'acc': 0.9011833333333333, 'step': 42000},\n",
       "  {'loss': 0.28222485764225325, 'acc': 0.8981666666666667, 'step': 43000},\n",
       "  {'loss': 0.27778983692129455, 'acc': 0.8999666666666667, 'step': 44000},\n",
       "  {'loss': 0.2632630117952824, 'acc': 0.9054, 'step': 45000},\n",
       "  {'loss': 0.2627141623675823, 'acc': 0.9044166666666666, 'step': 46000},\n",
       "  {'loss': 0.2630361086775859, 'acc': 0.9050833333333334, 'step': 47000},\n",
       "  {'loss': 0.26094846349755924, 'acc': 0.9059833333333334, 'step': 48000},\n",
       "  {'loss': 0.2537163886606693, 'acc': 0.9098, 'step': 49000},\n",
       "  {'loss': 0.2684955363452435, 'acc': 0.8996333333333333, 'step': 50000},\n",
       "  {'loss': 0.2533536390682061, 'acc': 0.9093166666666667, 'step': 51000},\n",
       "  {'loss': 0.2487954020122687, 'acc': 0.91065, 'step': 52000},\n",
       "  {'loss': 0.24861884877880414, 'acc': 0.91105, 'step': 53000},\n",
       "  {'loss': 0.24084497548937797, 'acc': 0.9141333333333334, 'step': 54000},\n",
       "  {'loss': 0.24776971286932628, 'acc': 0.9098833333333334, 'step': 55000}]}"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 23
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T04:14:33.121771Z",
     "start_time": "2025-02-05T04:14:33.009195Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "# 定义一个名为 plot_learning_curves 的函数，接受以下参数：\n",
    "# record_dict: 包含训练和验证记录的字典。\n",
    "# sample_step: 对训练数据进行采样的步长，默认值为 500。\n",
    "# 该函数用于可视化训练和验证过程中的性能指标。\n",
    "def plot_learning_curves(record_dict, sample_step=500):\n",
    "    # 将训练记录转换为 Pandas DataFrame，并设置 step 列为索引。然后对数据进行采样，步长为 sample_step\n",
    "    # pd.DataFrame(record_dict[\"train\"]): 将训练记录转换为 DataFrame。\n",
    "    # .set_index(\"step\"): 将 step 列设置为索引。\n",
    "    # .iloc[::sample_step]: 对数据进行采样，每隔 sample_step 步取一个样本。\n",
    "    # 减少数据点的数量，使曲线更清晰，同时保留趋势\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "\n",
    "    # 将验证记录转换为 Pandas DataFrame，并设置 step 列为索引\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "\n",
    "    # 计算训练 DataFrame 的列数，即需要绘制的性能指标数量\n",
    "    # 确定需要创建的子图数量\n",
    "    fig_num = len(train_df.columns)\n",
    "\n",
    "    # 创建一个包含 fig_num 个子图的图形\n",
    "    # 为每个性能指标创建一个子图，方便对比\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "\n",
    "    # 遍历训练 DataFrame 的每一列（即每个性能指标）。\n",
    "    # 使用 enumerate 获取列名和索引\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        # train_df.index: x 轴数据（训练步数）。\n",
    "        # train_df[item]: y 轴数据（性能指标值）。\n",
    "        # label=f\"train_{item}\": 设置曲线的标签。\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "\n",
    "        axs[idx].grid()  # 在当前子图上添加网格线\n",
    "        axs[idx].legend()  # 在当前子图上添加图例\n",
    "\n",
    "        # 生成 x 轴的刻度数据，从 0 到最大步数，步长为 5000\n",
    "        x_data = range(0, train_df.index[-1], 5000)\n",
    "\n",
    "        axs[idx].set_xticks(x_data)  # 设置 x 轴的刻度位置\n",
    "\n",
    "        # 设置 x 轴的刻度标签，将步数转换为“k”格式（如 5000 → \"5k\"）\n",
    "        # map(lambda x: f\"{int(x / 1000)}k\", x_data): 将刻度数据转换为“k”格式。\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x / 1000)}k\", x_data))\n",
    "\n",
    "        axs[idx].set_xlabel(\"step\")  # 设置 x 轴的标签为“step”\n",
    "\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "plot_learning_curves(record, sample_step=500)"
   ],
   "id": "fd660c6c34405015",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 25
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 评估",
   "id": "66017b4d01ed95d3"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T04:14:56.890980Z",
     "start_time": "2025-02-05T04:14:56.886537Z"
    }
   },
   "cell_type": "code",
   "source": [
    "model = NeuralNetwork()  #上线时加载模型\n",
    "model = model.to(device)"
   ],
   "id": "972a6acbc1d27676",
   "outputs": [],
   "execution_count": 26
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-05T04:15:49.136729Z",
     "start_time": "2025-02-05T04:15:46.083492Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#模型保存有两种情况，一种是模型结构和模型参数都保存，一种是只保存模型参数，需要加上weights_only=True\n",
    "model.load_state_dict(torch.load(\"checkpoints/best.ckpt\", weights_only=True, map_location=\"cpu\"))\n",
    "\n",
    "model.eval()\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "id": "3f19a96d387b0678",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.2408\n",
      "accuracy: 0.9141\n"
     ]
    }
   ],
   "execution_count": 27
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": "",
   "id": "2b5dc7b3abfe2168"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
